当ISR运行并发生另一个中断时会发生什么?

Ben*_*ebe 19 embedded avr interrupt

如果ISR正在运行,会发生另一个中断,会发生什么?第一个中断是否被中断?第二个中断会被忽略吗?或者在第一次ISR完成后会发射吗?

编辑 我忘了将它包含在问题中(但我将其包含在标签中),我想问一下这是如何在Atmel AVR上运行的.

gbu*_*dan 28

通常,中断服务程序一直进行直到完成而不会在大多数系统中自行中断.但是,如果我们有一个更大的系统,多个设备可能会中断微处理器,可能会出现优先级问题.

如果在当前中断内设置中断允许标志,则可以允许进一步的中断优先于正在执行的中断.这种"中断中断"称为嵌套中断.它通过停止执行原始服务例程并在堆栈上存储另一个寄存器序列来处理.这类似于嵌套子例程.由于每个中断自动递减堆栈指针并随后通过RETURN指令递增,因此在第二个中断完成后恢复第一个中断服务程序,并按正确的顺序处理中断.中断可以嵌套到任何深度,仅受可用于堆栈内存量的限制.

例如,在下图中,线程A正在运行.中断IRQx导致中断处理程序Intx运行,它被IRQy及其处理程序Inty抢占.Inty返回一个导致线程B运行的事件; Intx返回一个导致Thread C运行的事件.

在此输入图像描述 图片参考

对于硬件中断,优先级中断控制器芯片(PIC)是硬件芯片,旨在使设备的任务简单地向CPU显示其自己的地址.PIC还评估连接到它的设备的优先级.现代PIC也可以编程,以防止产生低于期望水平的中断.

更新:嵌套中断如何在Atmel AVR上运行

AVR硬件清零全局中断标志SREG进入一个中断向量地址.因此,通常中断在处理程序内部保持禁用,直到处理程序退出,其中RETI指令(由编译器作为中断处理程序的正常函数结尾的一部分发出)最终将重新启用进一步的中断.因此,中断处理程序通常不会嵌套.对于大多数中断处理程序,这是所需的行为,对于某些行为甚至是必需的,以防止无限递归中断(如UART中断或电平触发的外部中断).

在极少数情况下,虽然在中断处理程序中尽可能早地重新启用全局中断标志,但可能需要嵌套中断,以便不会推迟任何其他中断,而不是绝对需要.这可以在中断处理程序的开头使用sei()指令来完成,但是这仍然会在编译器生成的函数序言中留下很少的指令,以便在禁用全局中断的情况下运行.可以通过以下方式声明处理程序,指示编译器在中断处理程序的开头插入SEI指令:

ISR(XXX_vect, ISR_NOBLOCK)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

其中XXX_vect是MCU类型的有效中断向量的名称.

另外,有关Atmel AVR中断的更多信息,查看本应用笔记.

  • 这让我想起了我们在基于 Z80 的系统上遇到的一个恼人的错误。我们将 RTC 连接到 NMI 引脚以获得实时计数。问题是,RTC 每秒 * 发出 50% 的标记和 50% 的空间。再加上不可屏蔽中断是不可屏蔽的,*即使是它本身*,0.5s 的标记很快就会导致堆栈崩溃和系统挂起:/ (2认同)
  • 我认为,如果您区分 CPU 执行的操作、中断控制器执行的操作以及软件执行的操作,此答案会更有帮助。 (2认同)

Ben*_*ebe 5

中断的工作方式:

  1. 该代码设置“全局中断使能”位;没有它,将不会发生中断。

  2. 当某种情况引起中断时,将设置一个标志。

  3. 注意到中断标志时,将清除“全局中断允许”位。

  4. 运行适当的ISR。

  5. “全局中断允许”位被复位。

  6. 现在,事情可以回到第2步,除非在ISR中已经设置了中断标志。然后回到步骤3。

因此要回答这个问题:当第一个ISR完成时,将运行第二个ISR。

希望这可以帮助!

  • 对于某些处理器而言可能是正确的,但如今许多处理器具有多个中断优先级,在这种情况下,较高优先级的中断将抢占较低优先级的中断,其方式与中断抢占普通任务的方式几乎相同。 (3认同)
  • 您的描述是针对8位Microchip PIC芯片的。 (2认同)