一次只读一个read()或write(),我们可以通过USB接口增加批量数据吗?例如,我想传输1024(1K)字节数据块,如果设备只有64字节的限制,有没有办法可以通过USB增加read()和write()系统调用的数据包大小?
在主机 - >设备环境中,通过USB进行数据传输的大小是否有任何限制?
谢谢。-AD
答案 0 :(得分:1)
越大越好 作为一般规则,您发送的越多,USB传输速度就越快(批量)。 我认为我们以2MB的大块打出了甜蜜点。 唯一的限制是主机控制器可以处理的缓冲区大小。
有点为什么 该协议以1ms(全速)1 / 8ms(高速)块的形式对总线进行计时。在此期间可以发送0~15个大容量数据包(64B / 512B满/高速)。
在控制器中设置USB传输并处理其完成需要一些时间。
全速10转移的示例: ms0 - 设置OHCI以传输10字节 ms1 - 传输10字节(这可能实际发生在下一个1ms间隔) ms2 - 中断以通知完成。 - 3ms发送10bytes
640字节传输的示例: ms0 - 设置OHCI ms1 - 传输640bytes ms3 - 中断 - 3ms发送640bytes。
我想你得到的照片。
设备的IO缓冲区大小不会改变上述断言,因为较大的主机/设备传输会避免设置/处理开销。
非常慢的设备和256字节传输的示例 ms0 - 设置OHCI ms1 - 发送64,获取NAK .. ms2 - 发送64,获取NAK .. ms3 - 发送64,获取NAK .. ms4 - 发送64,获取NAK .. ms5 - 中断
希望这有帮助
答案 1 :(得分:1)
如果是read(),你正在谈论的是write()文件系统调用吗?
然后,AFAIK,您几乎或根本无法控制底层设备的数据调度策略。话虽如此,从应用程序总是更好地排队大量数据,这样 COMMAND-RESPONSE事务开销的数量下降。
顺便说一下,如果你在谈论 BUS LEVEL READ& WRITE 事务,然后在USB2.0中,支持MAXIMUM BULK PACKET SIZE是512字节(与大多数存储设备中1扇区的大小相同),这是足够好的。很多时候,这些 PIPES将在主机缓冲区中具有PING-PONG实现,这意味着,任何超过1024字节的内容都将有效地等待物理硬件上层的某些地方(比如主机PC缓存~~~)
答案 2 :(得分:0)
要直接回答您的问题,您无法增加最大数据包大小。它由USB定义,原因有很多。
但是,实际的最大数据包大小不会限制SW级别的传输大小。使用64字节的最大数据包大小,您仍然可以使用单个URB设置更大的传输。实际上,这是获得大量合理高带宽的唯一方法 - 您的SW应该在USB“传输”级别工作,而不是数据包级别。
较短的数据包大小会导致线路上的额外开销(更多报头,CRC和数据包间隙),但大约为5-10%。无论如何你无法改变它。