cuberli
驱动牛犊
驱动牛犊
  • 注册日期2008-06-18
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望19点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2194回复:10

大侠帮帮忙吧,bulk传输速度慢!

楼主#
更多 发布于:2008-08-12 09:52
我使用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的时间。请各位大侠帮忙看一下了。小弟被这个问题困了快一个月了!!先谢谢了!!!!!!!!!!!!!!!
cuberli
驱动牛犊
驱动牛犊
  • 注册日期2008-06-18
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望19点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-08-12 09:56
自己顶一下,我下载测试的速度大概是75K byte/s.还发现status = Pipe3.SubmitUrb(pUrb, NULL, NULL,20);向下层发送后延时才发生的,有人碰到同样的问题吗?急啊,在线等各位的答复。
milosky
驱动牛犊
驱动牛犊
  • 注册日期2004-12-16
  • 最后登录2008-08-15
  • 粉丝0
  • 关注0
  • 积分604分
  • 威望79点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分10分
板凳#
发布于:2008-08-12 16:33
关注一下,确认硬件或者连接线没有质量问题影响效率吗?
我们的设备采用较差数据线的时候,发生install重传会影响效率。
We are in the same boat!:)
cuberli
驱动牛犊
驱动牛犊
  • 注册日期2008-06-18
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望19点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-08-12 17:25
大侠还在吗?我在芯片中将NAKINI,NAKOUTI,OVERFLOW,UNDERFLOW,STALL都开中断,但是在传输出现延时的时候也不会进这些中断。这个延时就是不知道是怎么来的,万事具备就差这个问题了,呵呵,请多指导。呵呵
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-08-13 08:14
既然大都数时候每次少于1ms,那么每秒也应该有超过256K的速度了
偶尔会比较长时间应该是OS调度导致的,这个应该不会影响你的正常使用
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
cuberli
驱动牛犊
驱动牛犊
  • 注册日期2008-06-18
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望19点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-08-13 09:00
首先感谢大家的关注!!谢谢!问题是连续传输100次256个字节要用300ms的时间,也就是1s传输80Kbyte左右。在大批量传输的时候,这个延时发生的次数是定值,但是一次一次的传输的时候又是随机发生的。严重影响我的判断了。请大侠们继续指导。
cuberli
驱动牛犊
驱动牛犊
  • 注册日期2008-06-18
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望19点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-08-13 09:02
自己再顶一下,等我把这个项目完成,一定把代码全贴出来,再把新的也整理下贴出来,请大家持续关注。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-08-13 16:20
USB通信使用异步方式性能会比同步方式高很多
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
zhangshiwu
驱动牛犊
驱动牛犊
  • 注册日期2008-06-17
  • 最后登录2009-06-20
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望36点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-08-13 16:53
抓个usb bushound 的log 先去定位问题出在那边
If i could, i surely would
cuberli
驱动牛犊
驱动牛犊
  • 注册日期2008-06-18
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望19点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-08-13 17:12
好的,正在用BUS HOUND看。
dragon_hn
驱动中牛
驱动中牛
  • 注册日期2002-05-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分297分
  • 威望40点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-08-13 21:44
跟PC应用程序也有关系的.
例如PC读取20MBytes的数据,“一次读取100KB,连续读取200次”与“一次读取2MB,连续读取10次”的结果是完全不同的.
www.dragon-2008.com 欢迎交流
游客

返回顶部