为什么不是USB中断驱动?

时间:2011-08-16 10:00:07

标签: usb hardware

使USB成为轮询机制而不是中断驱动的理由是什么?我能提出一些推理的答案是:

  • 将处理效率和粒度控制权交给操作系统,而不是设备本身。
  • 防止故障设备发生“中断风暴”。

我发现网上的一些解释说这主要是因为USB设备的性质。它们主要是基于微控制器的系统,不能对较大的传输进行排队,因此需要较短的中断间隔,并且这种短的中断间隔可能不是最有效的。这是真的吗?

还有其他原因吗?

3 个答案:

答案 0 :(得分:15)

USB开发的首要前提是“廉价芯片”。这是通过使用轮询完成的,这减少了对更高仲裁协议的需求。

Firewire确实允许来自设备甚至DMA的中断,但要贵得多。因此,USB在低成本领域获胜,而火线则在低延迟/低开销/ ......领域。由于历史USB或多或少赢得了。

答案 1 :(得分:6)

  

使USB成为轮询机制而不是中断驱动的理由是什么?

这似乎是反USB FUD(如恐惧 - 不确定性 - 怀疑)。

原因在于,这简化了硬件级别的事情 - 例如,没有更多的冲突。 USB是半双工的,以减少电缆中的电线数量,因此只有一个可以通话。

虽然USB在线路上使用轮询,但在软件中使用它后,您会注意到在USB中有中断。唯一的问题是延迟略有增加 - 在大多数用例中都不可思议。由于轮询通常在硬件IIRC中实现,因此只有在有新数据时才会通知软件。

在软件层面,有所谓的“中断端点” - 并猜测每个HID设备使用它们:鼠标,键盘和Josticks都是HID。

答案 2 :(得分:2)

有三种方法可以避免总线上的数据传输冲突:

  1. 有一个有点复杂的总线管理协议。这样的协议必须相当复杂,因为如果太简单,它会使总线相当慢(参见令牌环,它相当简单,但效率低下)。但是,拥有复杂的协议会使所有组件都变得昂贵,因为它们都需要管理逻辑,并且需要了解总线的实际工作方式(请参阅 Firewire)。

  2. 完全不要避免它们,允许它们但检测并处理它们。这也有点复杂,并且总线无法保证任何速度或延迟,就好像经常发生冲突一样,吞吐量会下降,延迟会增加(参见没有交换机的以太网,参见 WiFi)。

  3. 有一个总线主控器来控制谁可以在何时使用总线以及使用多长时间。这很便宜,因为只有主站必须是复杂的,并且主站可以提供有关速度或延迟的任何可能的保证。

而 (3) 是 USB 的工作原理,甚至主 USB 芯片也不需要复杂,因为主控通常是一台具有快速 CPU 的计算机,可以在软件中执行所有总线管理。

USB 设备芯片被转储为吐司。他们不需要了解公共汽车的漂亮细节。他们只需要寻找发送给他们的数据包,这些数据包要么是控制数据包,要么是控制数据包,例如请求元数据或选择配置、主机发送的数据包,或来自主机的轮询请求,说“如果你有东西要发送,总线现在是你的”。

为了确保主节点按时轮询它们,他们会根据请求分发一个简单的描述表,说明它们提供哪些端点、需要轮询的频率以及轮询时最多传输多少数据.主机可以使用该信息来建立轮询时间表,以确保所有设备都按时轮询并获得总线足够长的时间以允许其最大传输大小。当然,这并非在所有情况下都是可行的。如果您连接太多需要非常频繁轮询的设备并且总是想要发送大量数据,您的系统可能会拒绝添加新设备并出现错误,即无法再满足其轮询要求。然而,这种情况在实践中很少见,USB 仅限于 127 个设备(集线器算作设备,主站本身也是如此)。

电源管理的工作方式类似。每个设备都会告诉主设备它需要多少功率,并且主设备确保总线仍然可以提供那么多功率,同时考虑到有源集线器。如果您连接另一个设备并且总线无法再为其供电,则添加设备将失败并显示错误。

这允许一个相当复杂、强大且快速的总线系统,但其组件甚至不需要真正的 CPU。最简单的 USB 芯片只是连接到串行数据线(如内部 RS-232 总线或 I2C 总线)的桥接器,没有真正可配置的东西,它们不能运行软件或具有可以更新的固件。它们只是将传入的数据包放入缓冲区,然后通过串行总线逐位发送缓冲区内容,然后在另一个缓冲区中接收串行数据,并在轮询时返回缓冲区内容。至于告诉主机配置(包括设备和供应商 ID,以及人类可读的字符串),他们只需发送一个小的外部 EPROM 的内容。事情再简单不过了,但这样的芯片已经足以构建大量 USB 硬件。