请问Xtang以及各位大大,关于PCI/PCIE传输的速度问题。

对于PCI设备,最大的传输速率为132MB/s,PCIE x1最大的速率可以达到250MB/s,我现在存在一个疑惑,就是对于PCI设备(32位的),如果是没有DMA控制器,是不是只能按照out32(),in32(),或者一个32位的内存一个一个32位数据进行读写呢,如果是这样的话,那么PCI设备速度最多也就是数M/s而已,对于、PCI/PCIE而言,这个速度是不是有点不正常呢?
若是不是上述的情况,请问还有其他的API对PCI/PCIE设备进行操作,能否使用数据块的读写?还有就是PCIE的驱动与PCI驱动的编写有什么不一样的地方么,需要主要哪些问题呢? :laughing:

对于x86来说,PCI的IO操作需要用in/out,而MEMORY则可以直接读写,包括memcpy()等数据块操作.对于其他平台,由于没有IO的概念,IO和MEMORY都可以直接读写.实际上现在大多数PCI卡都不需要IO操作了.
从软件角度来说,PCI与PCIE不同的是中断产生的方式,PCIE支持基于消息传递的中断,也支持传统的PCI中断,但QNX的系统一般只支持传统模式,所以PCI驱动与PCIE驱动没什么不同.

你好,请问关于memorycpy()的话,是按照32位来操作的么?只是处理的节奏紧凑些,还是说,按照我给块一次性传递过去呢?因为我看了下关于memcpy()网上的一些源码。我看了下,网上有人说Memcpy()的源码如下:

void * memcpy (void * dst, const void * src, size_t count)
{
         void * ret = dst;
         while (count--) {
                 *(char *)dst = *(char *)src;
                 dst = (char *)dst + 1;
                 src = (char *)src + 1;
         }
         return(ret);
}

来源于:http://hi.baidu.com/auxor/blog/item/aea68f51a818a86b843524e7.html,如果按照源码上的意思的话,应该是按照32位来操作的。不知道我是否理解有误? 那么请问如果我想实现更高位的传输比如一次性传输128位,该使用哪个Api呢?还是说只用使用DMA方式?
PS.系统是一个32位的。

你引用的源码是最基本的memcpy(),是按字节考贝的。

真的memcpy(),一般都做了优化,使用汇编,并尽可能使用32bit来copy。(当然要考虑开始和结束的字节对齐)

QNX上没有别的memcpy()函数,所以你要么使用QNX的memcpy命令。要么开发你自己的128位的memcpy()命令。

:smiley: ,自己搞个memcpy,估计效率未必高。请问下关于QNX是否支持PCIe么?还是说PCIe只能当成PCI使用呢?看下comquter 大大的说的,貌似QNX不支持PCIe特有的功能?