【问题标题】:Why is not USB interrupt-driven?为什么不是USB中断驱动?
【发布时间】:2011-08-16 10:00:06
【问题描述】:

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

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

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

还有其他原因吗?

【问题讨论】:

  • 我正在考虑给你一个明显错误的前提 -1,你是指控制器还是总线本身?
  • @Hasturkun:我的意思是让主机硬件不断轮询USB设备的部分。
  • 那部分将是总线/协议本身。除非主机轮询设备以获取该数据,否则主机无法判断设备是否提供数据,因此它必须不断轮询是否存在 IN 端点和来自驱动程序的活动请求以在该端点上接收数据.

标签: usb hardware


【解决方案1】:

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

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

【讨论】:

  • 成本!是的,这很有道理。
【解决方案2】:

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

这似乎是反 USB FUD(如在 Fear-Uncertainy-Doubt 中)。

原因是这大大简化了硬件层面的事情——例如不再有冲突。 USB 是半双工的,以减少电缆中的电线数量,所以无论如何只有 一个 可以通话。

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

在软件层面,有所谓的“中断端点”——猜猜看,每个 HID 设备都使用它们:鼠标、键盘和操纵杆都是 HID。

【讨论】:

  • USB 是半双工与轮询机制决策相关还是 USB 设计的其他方面之一?
  • 关于反 USB 部分:我只是让那个程序员对轮询系统与中断驱动相比的各种低效率感到不满,我正试图找出这些决定背后的原因。
  • 轮询会增加延迟。特别是当多个设备在同一总线上共存时,因为 PC 必须轮询设备,以防它们有东西要交付。因此,许多音频设备更喜欢使用火线。任何事物都有其优点和缺点。
  • @Turbo J “这似乎是反 USB FUD”——哇。多么惊人的讽刺。 MS 自己服用小剂量药物。
  • @John Chadwick 不在 include/uapi/linux/usb/ch9.h 中 :( 但恕我直言,最好不要偏离 USB 规范。
【解决方案3】:

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2016-03-10
    • 1970-01-01
    • 2013-11-19
    • 2016-08-04
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多