微处理器设计/中断
中断是一种会导致微处理器暂时处理不同任务,然后返回到先前任务的条件。中断可以是内部的或外部的。内部中断或“软件中断”由软件指令触发,其工作方式类似于跳转或分支指令。外部中断或“硬件中断”是由外部硬件模块引起的。例如,许多计算机系统使用中断驱动的 I/O,这是一个按下键盘上的键或点击鼠标上的按钮会触发中断的过程。处理器停止正在做的事情,它读取来自键盘或鼠标的输入,然后它返回到当前程序。
下图从概念上展示了中断是如何发生的
灰色条表示控制流。顶行是当前正在运行的程序,底行是中断服务例程 (ISR)。注意,当中断 (Int) 发生时,程序停止执行,微控制器开始执行 ISR。ISR 完成后,微控制器返回到处理程序中断的位置。
中断性能取决于硬件和软件。中断性能的两个最重要的属性是 IRQ 延迟和吞吐量。[1]
现代硬件和软件系统通常非常复杂,以至于几乎不可能通过查看源代码和数据手册提前推断出中断延迟,因此它通常是通过实验直接测量的。[1][2]
一些处理器的指令需要多个周期才能执行,这会使延迟变得更糟。有些人建议避免使用这种高延迟指令。[3]
其他处理器专门设计用于提供可预测且更低的延迟响应时间。[4]
当处理器已经在执行先前中断请求的 ISR 的过程中时,外部硬件请求另一个中断会发生什么?
当第一个中断被请求时,处理器中的硬件会使其完成当前指令,禁用进一步的中断,然后跳转到中断处理程序。
处理器会忽略进一步的中断,直到它到达中断处理程序中包含“从中断返回”指令的部分,该指令会重新启用中断。
如果在中断关闭时发生中断请求,一些处理器将在中断重新打开后立即跳转到该中断处理程序。对于这种处理器,中断风暴会“饿死”主循环背景任务。其他处理器至少执行主循环中的一个指令,然后再处理中断,[5][6][7]因此主循环可能会执行得非常缓慢,但至少它永远不会“饿死”。
少数处理器有一个中断控制器,支持“循环调度”,这可以用来防止低优先级中断处理程序的另一种“饿死”。[8]
一些处理器没有“禁用中断”指令无限期地延迟中断,而是使用“锁定”指令暂时延迟中断,正好 16 个机器指令,之后延迟中断(如果有)会自动接收。[9]
通常,新手固件程序员会编写中断服务例程,这些例程会使中断关闭太长时间,这会导致难以调试的问题,当处理器错过来自同一硬件外设或无关硬件的中断时。有几种编写“可以中断的中断处理程序”的方法,[10]包括二级中断处理程序和嵌套中断。
许多现代通用操作系统,包括 RTOS,都有“二级中断处理程序”,它们像普通的用户级进程一样运行——中断打开,因此它们不仅可以被任何外部硬件中断请求中断,还可以被抢占式操作系统用来了解何时循环遍历所有可运行进程的计时器中断。
一级中断处理程序由硬件中断直接触发,应精心设计,以最大限度地减少它在返回之前保持中断关闭的时间。FLIH 通常在缓冲区中存储一些数据,并设置一些标志,指示操作系统在该缓冲区中的数据上运行相应的二级中断处理程序。
其他维基教科书中的更多详细信息:操作系统设计/调度进程/抢占#中断延迟 和 嵌入式系统/中断.
少数处理器支持“嵌套中断”。中断处理程序的第一部分应精心设计,以最大限度地减少它保持中断关闭的时间,然后尽快重新打开中断。[2]与二级中断处理程序类似,例程的其余部分不会影响延迟,因为它在中断打开的情况下运行。但是,这会引入相同的中断例程再次触发的可能性,这需要可重入中断处理程序,这可能会使中断延迟更糟。[11]
从大型分布式系统到微型嵌入式计算机,可预测的低延迟中断处理都很重要。[12]
硬实时系统需要确定性(低抖动)中断处理。[13]
- ↑ a b Oliver Horst; Johannes Wiesböck; Raphael Wild; Uwe Baumgarten. "量化网络物理系统中外部中断的延迟和可能的吞吐量".
- ↑ a b Jack Ganssle. "中断延迟".
- ↑ David Kleidermacher. "最大限度地减少中断响应时间".
- ↑ Peter Harris. "延迟测量".
- ↑ Q. "AVR 指南:中断".
- ↑ G. C. Hill. "ATmega 中断处理" 第 9 页
- ↑ Nick Gammon. "Arduino 中的中断是否会打断其他中断?". 引用:"处理器被设计为保证,当它从禁用中断状态转换到启用中断状态时,始终会执行一条额外的指令。"
- ↑ "AVR1503: Xplain 训练 - XMEGA 可编程多中断控制器".
- ↑ "System 801 操作原理". 1976. 第 59 页.
- ↑ Michael B. Jones; Stefan Saroiu. "软调制解调器的可预测调度".
- ↑ Jim Harrison. "实时:关于微控制器中断延迟的一些说明". 引用:"这避免了对可重入中断处理程序的需求,可重入中断处理程序会对中断延迟产生负面影响。"
- ↑ Benedict Herzog; Luis Gerhorst; Bernhard Heinloth; Stefan Reif; Timo Hönig; Wolfgang Schröder-Preikschat. "INTspect:Linux 内核中的中断延迟". doi:10.1109/SBESC.2018.00021
- ↑ Jonatan Lövgren. "使用硬件加速提高实时内核的性能和可预测性". 2016.