操作系统概念说:
在 I/O 期间,各种设备控制器在准备好提供服务时会发出中断。这些中断表示
- 输出已完成,或
- 输入数据可用,或
- 检测到故障。
中断是否用于表示输出已准备就绪或输入已完成?
如果不是,是否需要通过其他方式来表示?
谢谢。
答案1
在最基本的层面上,中断用于传达非常简单的 ”嘿!来看看我“从一件事物到另一件事的信息......
它们可以是硬件(例如:电压指示状态),也可以是软件(例如:用户按下Ctrl+ C)。
有些中断真的有些问题很重要,必须立即处理,而有些问题则不太重要,可能在一段时间内不需要处理。
列出中断的所有用途是不可能的,部分原因是新技术带来了新功能,而且很可能还有中断的新原因。
在集成电路,通常可能会出现具有非常具体含义的中断,例如:
- UART(即串行端口)
- 帧已被接收 - 这可能意味着主机现在必须从外围设备的寄存器中获取该帧的有效负载,并在另一个帧到达之前存储它,覆盖第一个帧。
- 帧已发送——这意味着主机现在可以自由地将新数据提交到外设的寄存器中,从而传输另一帧
- 计时器
- 脉宽调制
- 计数器已回绕或达到其上限 - 用于重置 PWM 信号
- 计数器已达到其比较值 - 用于设置 PWM 信号
- 调度 - 用于抢占正在运行的任务,并安排另一个
- 脉宽调制
- 除以零——某些东西试图让宇宙崩溃,但被阻止了……这个中断允许采取一些整理或补救措施(例如:终止应用程序)。
当离散(独立)组件需要通信时,中断可能需要一些交互才能解密 - 主要是因为否则需要大量的互连和 I/O 引脚。例如:
- A实时时钟- 收到中断后,主机将查询其中一个寄存器,并可能确定“警报 2”已被触发。其结果取决于系统。
- 声卡
- 声卡可能有一个缓冲区,允许主机生成音频块,声卡将自动播放这些音频块。如果此缓冲区不足,则主机必须提供更多数据,否则缓冲区将不足(耗尽)...
- 如果中断没有及时得到处理,那么您可能会听到重复的音频片段,如下图所示这里因系统强制崩溃
中断通常可以被软件忽略,而由直接内存访问模块。使用 DMA,软件可以忽略硬件的低级处理 - 例如,当整个数据包到达时而不是每个符号到达时才收到通知。
答案2
设备可以使用中断来发出各种事件的信号。事实上,设备或设备控制器的任何状态变化都可以通过中断报告给主机 CPU。这完全取决于设备硬件和固件的设计者。
(并且,人们希望,他们至少会询问那些必须编写驱动程序的可怜家伙的意见。太多的设备在设计时没有这样的输入,因此需要笨拙、低效的驱动程序设计。事实上,有些情况下,设备的某些功能无法得到充分利用,因为设备的主机接口(包括但不限于中断结构)在设计时没有意识到驱动程序中可以做什么和不能做什么。但我离题了。)
您引用的材料就其本身而言是正确的,但在我看来,这是一种非常简单的观点。
我不确定“输出就绪”与“输出完成”有何不同。(准备好从打印机输出托盘中取出?)同样,“输入数据可用”和“输入完成”在我看来非常接近同一件事。然而,它们可能意味着驱动程序需要做不同的工作。对我来说,“输入完成”意味着传入的数据在主机内存中,本地线程的 I/O 操作可以完成,而“输入数据可用”可能意味着驱动程序仍需要将其从设备的接口移动到内存缓冲区。
但这只是语义问题。作为驱动程序编写者,您必须仔细阅读设备主机接口规范,以了解任何给定中断的真正含义以及您应该如何处理它。有时您甚至需要阅读固件代码或研究逻辑图。(那是边沿触发还是电平触发的触发器?设备工程师有时会有最奇怪的想法!但我又离题了……)
举一个稍微复杂一点的例子,考虑一个带有 FIFO 的通信接口。我们通常希望避免对主机产生过多的中断;例如,每个数据包的中断可能太多了。因此,我们的设备可能允许我们告诉它一系列要通过“FIFO”(先进先出)接口传输的缓冲区,然后设备会负责将它们全部移出网络。
但是我们不一定只希望在所有缓冲区都完成时才发生中断!如果当缓冲区只剩下 20% 或 10% 时通知我们,那就更好了。当我们收到这样的中断时,我们会在 FIFO 中放入更多缓冲区(当然,当缓冲区已满时会停止)。如果我们只在 FIFO 为空时收到中断,那么在将下一个缓冲区发送到它进行传输之前会有一点延迟,从而降低吞吐量。通过在 FIFO“即将”为空时给我们一个中断,我们可以消除这种延迟。