阅读:2194回复:10
大侠帮帮忙吧,bulk传输速度慢!
我使用AVR的AT90USB162芯片和PC机USB口通讯,要求PC机读数据的速度在250K byte/S以上。我的固件程序已经写好,读写数据通过跟踪也是正常的。具体参数是:有读,写两个端点,都是BULK方式的,参数如下:
#define RX_EP_SIZE 0x40 #define ENDPOINT_NB_2 0x83 #define EP_ATTRIBUTES_2 0x02 // BULK = 0x02, INTERUPT = 0x03,ISOCHRONOUS = 1 #define EP_SIZE_2 RX_EP_SIZE #define EP_INTERVAL_2 0x00 #define TX_EP_SIZE 0x40 #define ENDPOINT_NB_1 TX_EP #define EP_ATTRIBUTES_1 0x02 // BULK = 0x02, INTERUPT = 0x03 #define EP_SIZE_1 TX_EP_SIZE #define EP_INTERVAL_1 0x00 关于读写函数我使用队列的方式,调用DeviceIoControl()函数处理,具体代码如下: 读: DeviceIoControl(hDev, USB2SPI_IOCTL_READ,NULL, 0, lpBuf, wLength, &dwReturned, NULL); 这个函数又会调用: void bulkDevice::Serial_USB2SPI_IOCTL_READ_Handler(KIrp I) { T.Trace(TraceInfo, __FUNCTION__"++. IRP %p\n", I); NTSTATUS status = STATUS_SUCCESS; ULONG ulReturned = 0; ULONG inputSize = I.IoctlInputBufferSize(); ULONG outputSize = I.IoctlOutputBufferSize(); // Direct ioctl PVOID inputBuffer = I.IoctlBuffer(); PVOID outputBuffer = NULL; if (I.Mdl() != NULL) { KMemory Mem(I.Mdl()); // Note that this routine is safe on all platforms. outputBuffer = Mem.MapToSystemSpace(); } PURB pUrb = Pipe3.BuildBulkTransfer( outputBuffer, outputSize, TRUE, NULL, TRUE, NULL ); status = Pipe3.SubmitUrb(pUrb, NULL, NULL,20); ulReturned = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength; I.Information() =ulReturned; I.Status() = status; Pipe3Queue.PnpNextIrp(I); 写数据也采用相似的结构。每次读256个字节的数据,现在的问题是我通过测试发现偶尔读一次数据要用15ms的时间,而大多数的时候用少于1ms的时间。请各位大侠帮忙看一下了。小弟被这个问题困了快一个月了!!先谢谢了!!!!!!!!!!!!!!! |
|
沙发#
发布于:2008-08-12 09:56
自己顶一下,我下载测试的速度大概是75K byte/s.还发现status = Pipe3.SubmitUrb(pUrb, NULL, NULL,20);向下层发送后延时才发生的,有人碰到同样的问题吗?急啊,在线等各位的答复。
|
|
板凳#
发布于:2008-08-12 16:33
关注一下,确认硬件或者连接线没有质量问题影响效率吗?
我们的设备采用较差数据线的时候,发生install重传会影响效率。 |
|
|
地板#
发布于:2008-08-12 17:25
大侠还在吗?我在芯片中将NAKINI,NAKOUTI,OVERFLOW,UNDERFLOW,STALL都开中断,但是在传输出现延时的时候也不会进这些中断。这个延时就是不知道是怎么来的,万事具备就差这个问题了,呵呵,请多指导。呵呵
|
|
地下室#
发布于:2008-08-13 08:14
既然大都数时候每次少于1ms,那么每秒也应该有超过256K的速度了
偶尔会比较长时间应该是OS调度导致的,这个应该不会影响你的正常使用 |
|
|
5楼#
发布于:2008-08-13 09:00
首先感谢大家的关注!!谢谢!问题是连续传输100次256个字节要用300ms的时间,也就是1s传输80Kbyte左右。在大批量传输的时候,这个延时发生的次数是定值,但是一次一次的传输的时候又是随机发生的。严重影响我的判断了。请大侠们继续指导。
|
|
6楼#
发布于:2008-08-13 09:02
自己再顶一下,等我把这个项目完成,一定把代码全贴出来,再把新的也整理下贴出来,请大家持续关注。
|
|
7楼#
发布于:2008-08-13 16:20
USB通信使用异步方式性能会比同步方式高很多
|
|
|
8楼#
发布于:2008-08-13 16:53
抓个usb bushound 的log 先去定位问题出在那边
|
|
|
9楼#
发布于:2008-08-13 17:12
好的,正在用BUS HOUND看。
|
|
10楼#
发布于:2008-08-13 21:44
跟PC应用程序也有关系的.
例如PC读取20MBytes的数据,“一次读取100KB,连续读取200次”与“一次读取2MB,连续读取10次”的结果是完全不同的. |
|
|