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

37

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

编辑 我忘记在问题中加入了(但是我在标签中加入了),我想问的是Atmel AVR的工作原理。


你是在谈论同一个中断的多个还是不同的中断? - Jim
7
不同的中央处理器会有不同的反应,对于某些中央处理器,其反应将取决于中断控制器的方式以及编程情况,有时还与中断类型有关。如果你能更具体地提出问题,我们或许可以给出更好的答案。 - Wouter van Ooijen
同意。使用快速中断的PIC、带有NVIC的ARM Cortex和普通PIC的功能都不同。 - Scott Seidman
@BenjiWiebe,你编辑后我已经更新了我的回答。 - gbudan
您没有提供足够的信息 - CPU本身只是故事的一部分。最终允许或禁止嵌套中断的是软件。所以发生什么完全取决于您。 - Kuba hasn't forgotten Monica
x86汇编中断服务例程能否调用另一个中断服务例程? - Ciro Santilli OurBigBook.com
2个回答

41
通常情况下,在大多数系统中,中断服务例程会在完成自身的过程中继续执行,而不会被中断。然而,如果我们有一个更大的系统,在这个系统中,几个设备可能会中断微处理器,那么就可能出现优先级问题。
如果在当前中断中设置了中断使能标志,那么您可以允许比正在执行的中断优先级更高的其他中断。这种“中断中断”称为嵌套中断。它通过停止原始服务例程的执行并在堆栈上存储另一个寄存器序列来处理。这类似于嵌套子程序。由于每次中断自动递减堆栈指针,并由RETURN指令随后递增,因此第一个中断服务例程在第二个中断完成后恢复执行,并按正确顺序处理中断。中断可以嵌套到任意深度,仅受用于堆栈的可用内存量的限制。
例如,在以下图表中,线程A正在运行。中断IRQx导致中断处理程序Intx运行,该程序被IRQy和其处理程序Inty所抢占。 Inty返回事件导致线程B运行; Intx返回事件导致线程C运行。

enter image description here 图片引用

对于硬件中断,优先级中断控制器芯片(PIC)是专门设计的硬件芯片,旨在使设备向CPU呈现自己的地址变得简单。PIC还评估连接到它的设备的优先级。现代PIC也可以编程以防止生成低于所需级别的中断。

更新:Atmel AVR上嵌套中断的工作原理

AVR硬件在进入中断向量之前会清除SREG中的全局中断标志。因此,在处理程序内部,通常情况下中断保持禁用,直到处理程序退出,RETI指令(作为中断处理程序的正常函数序言的一部分由编译器发出)最终将重新启用其他中断。因此,中断处理程序通常不会嵌套。对于大多数中断处理程序来说,这是期望的行为,对于某些中断处理程序来说,甚至需要防止无限递归中断(例如UART中断或电平触发的外部中断)。
但在极少数情况下,可能希望通过尽早重新启用全局中断标志来实现嵌套中断,以便不延迟任何其他中断超过绝对必要的时间。可以使用一个sei()指令在中断处理程序的开头就实现这一点,但这仍然留下了很少的指令在由编译器生成的函数序言中禁用全局中断运行。可以通过以下方式声明处理程序,让编译器在中断处理程序的开头插入SEI指令:
ISR(XXX_vect, ISR_NOBLOCK)
{
  ...
}

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

此外,查看应用笔记以获取有关Atmel AVR上中断的更多信息。


2
这让我想起了在一个基于Z80的系统上出现的一个恼人的错误。 我们将实时计数器(RTC)连接到NMI引脚上,以获取实时计数。 问题是,RTC每秒发射50%的占空比。 再加上不可掩盖中断本身就无法被掩盖, 那0.5秒的占空比很快就会导致堆栈崩溃和系统挂起 :/ - slugonamission
2
如果您能区分CPU、中断控制器和软件各自的工作,我认为这个答案会更有帮助。 - Gilles 'SO- stop being evil'
1
应用笔记的链接已经更改 - Armin J.
一个ISR何时完成?谁决定了这一点?是当ISR函数结束时吗?还是当ISR函数清除ISR位时?或者是在一段时间后自动完成? - schanti schul

6
中断的工作方式如下:
  1. 代码设置“全局中断使能”位; 没有它,不会发生任何中断。

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

  3. 在注意到中断标志后,将清除“全局中断使能”位。

  4. 运行适当的ISR。

  5. 重新设置“全局中断使能”位。

  6. 现在回到步骤2,除非在ISR期间已经设置了中断标志; 然后回到步骤3。

因此,回答问题:第一个ISR完成后,将运行第二个ISR。
希望这有所帮助!

4
这可能对某些处理器是正确的,但如今许多处理器都具有多个中断优先级,在这种情况下,高优先级中断将像中断常规任务一样抢占低优先级中断。 - Jim
2
你的描述非常具体,适用于8位微芯片PIC芯片。 - Wouter van Ooijen
1
@WoutervanOoijen 真的吗?这也适用于 8 位 Atmel MCU。 - BenjiWiebe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接