Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用USB2.0对数据传输块大小有限制吗?_Usb - Fatal编程技术网

使用USB2.0对数据传输块大小有限制吗?

使用USB2.0对数据传输块大小有限制吗?,usb,Usb,通过一次读取()或写入(),我们可以通过USB接口增加批量数据大小吗?例如,我想传输1024(1K)字节的数据块,如果设备只有64字节的限制,有没有办法通过USB增加读()和写()系统调用的数据包大小 在主机->设备环境中,通过USB传输数据的大小是否有任何限制 多谢各位 -广告越大越好 一般来说,发送的越多,USB传输的速度就越快(批量传输)。 我认为我们达到了2MB块的最佳点。 唯一的限制是主机控制器可以处理的缓冲区大小 一点原因 协议以1ms(全速)1/8ms(高速)数据块对总线进行计时。

通过一次读取()或写入(),我们可以通过USB接口增加批量数据大小吗?例如,我想传输1024(1K)字节的数据块,如果设备只有64字节的限制,有没有办法通过USB增加读()和写()系统调用的数据包大小

在主机->设备环境中,通过USB传输数据的大小是否有任何限制

多谢各位


-广告越大越好 一般来说,发送的越多,USB传输的速度就越快(批量传输)。 我认为我们达到了2MB块的最佳点。 唯一的限制是主机控制器可以处理的缓冲区大小

一点原因 协议以1ms(全速)1/8ms(高速)数据块对总线进行计时。在此期间,可以发送0-~15个大容量数据包(64B/512B全/高速)

在控制器中设置USB传输并处理其完成需要时间

10字节全速传输示例: ms0-设置OHCI以传输10字节 传输ms1-10字节(这可能在下一个1ms的间隔内发生) ms2-中断以通知完成。 -3ms发送10字节

640字节传输的示例: ms0-设置OHCI ms1-传输640字节 ms3-中断 -3ms发送640字节

我想你明白了

设备的IO缓冲区大小不会改变上述断言,因为较大的主机/设备传输可以避免设置/处理开销

非常慢的设备和256字节传输示例 ms0-设置OHCI ms1-发送64,获取NAKs。。 ms2-发送64,获取NAKs。。 ms3-发送64,获取NAKs。。 ms4-发送64,获取NAKs。。 ms5-中断

希望这对您所说的read()、write()文件系统调用有所帮助

那么,您对底层设备的数据调度策略几乎没有控制权。话虽如此,应用程序最好将大量数据排队,这样命令响应事务开销的数量就会减少

顺便说一句,如果您谈论的是总线级读写事务,那么在USB2.0中,支持的最大批量数据包大小是512字节(与大多数存储设备中1个扇区的大小相同),这就足够了


很多时候,这些管道将在主机缓冲区中实现乒乓球,这意味着任何超过1024字节的内容都将有效地等待物理硬件上层的某个位置(如主机PC缓存~~~)

直接回答您的问题,您不能增加最大数据包大小。它是由USB定义的,原因有很多

但是,实际的最大数据包大小并不限制SW级别的传输大小。使用64字节的最大数据包大小,您仍然可以使用单个URB设置更大的传输。事实上,这是批量获得合理高带宽的唯一方法——您的软件应该在USB“传输”级别工作,而不是在数据包级别


较短的数据包大小确实会在线路上造成一些额外的开销(更多的报头、CRC和数据包之间的间隙),但这大约是5-10%。你无论如何也不能改变它。

关于“唯一的限制是你的主机控制器可以处理的缓冲区大小”的伟大回答@Boris,你知道确定缓冲区大小的方法吗?@davidcefreitas,这取决于控制器的硬件。这通常在控制器的文档中指定,并且是特定于硬件的。