将USB作为轮询机制而不是中断驱动的原因是什么?我能提出一些推理的答案是:
我发现网上的一些解释说这主要是因为USB设备的性质.它们主要是基于微控制器的系统,不能对较大的传输进行排队,因此需要较短的中断间隔,并且这种短的中断间隔可能不是最有效的.真的吗?
还有其他原因吗?
Chr*_*her 15
USB开发的首要前提是"廉价芯片".这是通过使用轮询完成的,这减少了对更高仲裁协议的需求.
Firewire确实允许来自设备甚至DMA的中断,但要贵得多.因此,USB在低成本领域获胜,而火线则在低延迟/低开销/ ......领域.由于历史USB或多或少赢得了.
有三种方法可以避免总线上的数据传输冲突:
有一个有点复杂的总线管理协议。这样的协议必须相当复杂,因为当太简单时,它会使总线相当慢(参见令牌环,它相当简单,但效率低下)。然而,拥有复杂的协议会使所有组件变得昂贵,因为它们都需要管理逻辑并且需要了解总线的实际工作原理(请参阅 Firewire)。
根本不要回避它们,允许它们存在,但要检测并处理它们。这也有些复杂,总线无法保证任何速度或延迟,就好像不断发生冲突一样,吞吐量会下降,延迟会增加(请参阅没有交换机的以太网,请参阅 WiFi)。
拥有一个总线主控器来控制谁可以在何时使用总线以及使用多长时间。这是便宜的,因为只有主设备必须是复杂的,并且主设备可以提供有关速度或延迟的任何可能的保证。
(3)是USB的工作原理,甚至USB主芯片也不需要很复杂,因为主芯片通常是一台具有快速CPU的计算机,并且可以在软件中执行所有总线管理。
USB 设备芯片被转储为吐司。他们不需要了解公交车的细节。他们只需要寻找发给他们的数据包,这些数据包要么是控制数据包,例如请求元数据或选择配置,由主机发送的数据包,要么是来自主机的轮询请求,说“如果你有东西要发送,总线就会现在是你的了”。
为了确保主站按时轮询它们,他们根据请求提供了一个简单的描述表,该表解释了它们提供的端点、需要轮询的频率以及轮询时最多传输多少数据。主设备可以使用该信息来建立轮询时间表,以确保所有设备都按时轮询并获得总线足够长的时间以允许其最大传输大小。当然,这并非在所有情况下都是可能的。如果您连接了太多需要非常频繁轮询的设备并且总是想要发送大量数据,您的系统可能会拒绝添加新设备并出现错误,即无法再满足其轮询要求。然而这种情况在实践中很少见,USB 仅限于 127 个设备(集线器算作设备,主设备本身也算作设备)。
电源管理的工作原理类似。每个设备都会告诉主设备它需要多少功率,主设备确保总线仍然可以提供这么多功率,同时考虑到活动集线器。如果您连接另一个设备并且总线无法再为其供电,则添加设备将失败并出现错误。
这允许一个相当复杂、强大且快速的总线系统,但其组件甚至不需要真正的 CPU。最简单的 USB 芯片只是连接串行数据线(如内部 RS-232 总线或 I2C 总线)的桥接器,没有真正可配置的内容,并且它们无法运行软件或具有可以更新的固件。它们只是将传入的数据包放入缓冲区,然后通过串行总线逐位发送缓冲区内容,它们在另一个缓冲区中接收串行数据,并在轮询时返回缓冲区内容。至于告诉主机配置(包括设备和供应商 ID,以及人类可读的字符串),它们只需发送一个小型外部 EPROM 的内容。事情再简单不过了,但这样的芯片已经足以构建大量 USB 硬件。
将USB作为轮询机制而不是中断驱动的原因是什么?
这似乎是反USB FUD(如恐惧 - 不确定性 - 怀疑).
原因是这可以简化硬件级别的事情 - 例如不再发生冲突.USB是半双工的,以减少电缆中的电线数量,因此无论如何只有一个可以通话.
虽然USB采用轮询在电线上,一旦你在软件中使用它,你会发现,你必须在USB中断.唯一的问题是延迟略有增加 - 在大多数用例中都不可思议.由于轮询通常在硬件IIRC中实现,因此只有在有新数据时才会通知软件.
在软件层面,有所谓的"中断端点" - 并猜测每个HID设备使用它们:鼠标,键盘和Josticks都是HID.