全速 USB 的有效最大有效负载吞吐量是多少?

What is the effective maximum payload throughput for USB in Full Speed?

USB Full speed 的速度为 12 MBit/second = 1,5 MByte/s.

但是在这 12 MBit 中还传输了很多不是有效负载的额外数据,例如令牌、端点地址、CRC5、CRC16、确认、SOF + EOF 数据包等。此外,总线管理器保留 10%用于控制传输的帧。

Interrupt TransferUSB Made Simple Part 3

当我有一个 USB 端点处于中断模式且轮询间隔为 1 毫秒时,我可以每帧传输 64 个字节 = 64kByte/秒。

但是,如果我有 2 个端点的轮询时间为 1 毫秒怎么办? 然后主机将在 1 毫秒内轮询两个端点,所以我的总吞吐量为 128 kByte/s?

当主机同时轮询 15 个 IN 端点时,会导致 15 * 64 kByte = 960 kByte/s?

(为简单起见,我们假设没有 OUT 传输)

第一个问题: 虽然搜索了很多我找不到一个网站谈论全速最大有效负载吞吐量。

第二个问题: 全速允许最大 64 字节/数据包和 1 毫秒的最小轮询间隔。如果我想通过 IN 传输传输最大可能的有效负载,我是否应该使用多个端点并将数据传输分布在这些端点上?我有多少个端点才能达到极限?

第三个问题: 我看到在批量传输中,主机请求 IN 数据的频率超过每毫秒一次。这是否意味着批量传输比中断传输更快?

Third question: I see that in a Bulk transfer the host requests IN data more often than once per millisecond. Does this mean that Bulk is faster than Interrupt transfer?

A lot 更快。您可以使用单个批量端点达到大约 1 MByte/sec - 这也是 USB 全速可以获得的最大吞吐量。

简而言之:如果您的应用程序想要尽快传输数据,请使用批量端点。

我在 USB 2.0 规范的第 5.7.4 和 5.8.4 章找到了部分答案:

批量传输的协议开销为 13 个字节:(3 个 SYNC 字节、3 个 PID 字节、2 个端点 + CRC 字节、2 个 CRC 字节和 3 个字节的数据包间延迟)和 19 个字节用于中断传输(5 SYNC 字节、5 个 PID 字节、2 个端点 + CRC 字节、2 个 CRC 字节和 5 个字节的数据包间延迟)

如果使用 64 字节的数据负载,则批量传输的最大带宽为 1.216.000 Bytes/s。这意味着 1 毫秒的一帧可以传输 1216 字节 = 19 个 64 字节的块。

中断端点以每毫秒一次的最大间隔进行轮询,因此最大负载将为 64kB/s 或更少。

但这些值是理论值。该文档指出位填充被忽略。此外,此处忽略为控制传输保留的 10% 带宽。对于中断端点,最大吞吐量将为每毫秒 64 字节 = 64 kByte / 秒。

另一篇关于在不同全速设备和不同操作系统的现实生活中测得的速度的有趣文章非常有趣,因为它与理论值大相径庭,尤其是 Windows.

Paul 测得的最大速度为 1 Megabyte/second,但在 OUT 方向。

http://www.pjrc.com/teensy/benchmark_usb_serial_receive.html

https://www.pjrc.com/teensy/usb_serial.html