为什么不是USB中断驱动?

为什么不是USB中断驱动?,usb,hardware,Usb,Hardware,使USB成为轮询机制而不是中断驱动机制背后的原理是什么?我能给出一些理由的答案是: 将处理效率和粒度的控制权留给操作系统,而不是设备本身 防止故障设备造成“中断风暴” 我在网上找到的一些解释说,这主要是因为USB设备的特性。它们大多是基于微控制器的系统,不能对较大的传输排队,因此需要较短的中断间隔,而这种较短的中断间隔可能不是最有效的。这是真的吗 还有其他原因吗?USB发展的首要前提是“廉价芯片”。这是通过使用轮询实现的,轮询减少了对更高仲裁协议的需要 Firewire确实允许来自设备甚至D

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

  • 将处理效率和粒度的控制权留给操作系统,而不是设备本身
  • 防止故障设备造成“中断风暴”
我在网上找到的一些解释说,这主要是因为USB设备的特性。它们大多是基于微控制器的系统,不能对较大的传输排队,因此需要较短的中断间隔,而这种较短的中断间隔可能不是最有效的。这是真的吗


还有其他原因吗?

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

Firewire确实允许来自设备甚至DMA的中断,但其成本要高得多。因此USB在低成本领域获胜,firewire在低延迟/低开销方面获胜。。。领域由于历史原因,USB多多少少获胜

使USB成为轮询机制而不是中断驱动机制背后的原理是什么

这似乎是反USB FUD(如在恐惧、不确定和怀疑中)

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

当USB在线路上使用轮询时,一旦你在软件中使用它,你就会注意到USB中有中断。唯一的问题是在大多数用例中延迟的轻微增加是可以忽略的。由于轮询通常在硬件IIRC中实现,因此只有在有新数据时才会通知软件


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

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

  • 有一个比较复杂的总线管理协议。这样的协议必须非常复杂,因为太简单时,它会使总线相当慢(参见令牌环,它相当简单,但效率低下)。然而,拥有一个复杂的协议使得所有组件都很昂贵,因为它们都需要管理逻辑,并且需要了解总线的实际工作方式(参见Firewire)

  • 不要回避它们,允许它们,但要检测并处理它们。这也有点复杂,总线无法保证任何速度或延迟,因为如果不断发生冲突,吞吐量将下降,延迟将上升(请参阅无交换机以太网,请参阅WiFi)

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

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

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

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

    电源管理以类似的方式工作。每个设备都会告诉主机它需要多少电力,主机会确保总线仍然能够提供那么多电力,同时考虑到活动集线器。如果您连接了另一个设备,而总线无法再为其供电,则添加该设备将失败并出现错误


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

    我正在考虑给你一个-1,因为这显然是一个错误的前提,你是指控制器还是总线本身?@Hasturkun:我是指让主机硬件不断轮询USB设备的部分。那部分就是总线/协议本身。主机无法判断设备是否有数据可用,除非它轮询设备以获取该数据,因此它必须连续轮询是否存在端点内以及来自驱动程序的活动请求以在该端点上接收数据。USB是半双工的吗