gpt4 book ai didi

embedded - 当 ISR 正在运行并且另一个中断发生时会发生什么?

转载 作者:行者123 更新时间:2023-12-02 21:24:53 26 4
gpt4 key购买 nike

如果 ISR 正在运行,并且发生另一个中断,会发生什么情况?第一个中断是否被中断?第二个中断会被忽略吗?或者当第一个 ISR 完成时它会触发吗?

编辑我忘记将其包含在问题中(但我将其包含在标签中),我本想询问这在 Atmel AVR 上如何工作。

最佳答案

通常,在大多数系统中,中断服务例程会继续进行直至完成,而不会被中断。但是,如果我们有一个较大的系统,其中多个设备可能会中断微处理器,则可能会出现优先级问题。

如果您还在当前中断中设置了中断启用标志,那么您可以允许比正在执行的中断优先级更高的更多中断。这种“中断的中断”称为嵌套中断。它是通过停止执行原始服务例程并将另一个寄存器序列存储在堆栈上来处理的。这类似于嵌套子例程。由于每次中断都会自动递减堆栈指针,而 RETURN 指令会自动递增堆栈指针,因此第一个中断服务程序会在第二个中断完成后恢复,并且中断会按正确的顺序进行服务。中断可以嵌套到任意深度,仅受堆栈可用内存量的限制。

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

enter image description here Image Ref

对于硬件中断,优先中断 Controller 芯片 (PIC) 是硬件芯片,旨在使设备向 CPU 呈现其自身地址的任务变得简单。 PIC 还评估与其连接的设备的优先级。现代 PIC 还可以进行编程,以防止生成低于所需级别的中断。

更新:嵌套中断如何在 Atmel AVR 上工作

AVR 硬件在进入中断向量之前清除SREG中的全局中断标志。因此,通常中断在处理程序内部保持禁用状态,直到处理程序退出,其中 RETI 指令(由编译器作为中断处理程序正常函数尾声的一部分发出)最终将进一步重新启用中断。因此,中断处理程序通常不会嵌套。对于大多数中断处理程序来说,这是期望的行为,对于某些中断处理程序来说,甚至需要它来防止无限递归中断(例如 UART 中断或电平触发的外部中断)。

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

ISR(XXX_vect, ISR_NOBLOCK)
{
...
}

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

另外,看看这个 Application Note有关 Atmel AVR 中断的更多信息。

关于embedded - 当 ISR 正在运行并且另一个中断发生时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com