如果ISR运行时发生中断会发生什么

what happens if interrupt occurs while ISR running?

本文关键字:什么 中断 ISR 如果 运行时      更新时间:2023-10-16

我正在编程arduino,我在引脚2下降沿上附加了一个中断。当我在ISR时,ISR并没有执行所有的线路。在完成所有线路之前,如果下降边缘再次出现,会发生什么?中断是从头开始还是忽略它。这里我说的是第二针的唯一中断。

Atmel处理器在中断时禁用中断:

(第4.4节:位7–I:全局中断启用)

全局中断启用位必须设置为已启用。然后执行单独的中断启用控制在单独的控制寄存器中。如果全局中断启用寄存器被清除时,没有任何中断独立于单独的中断启用设置。I位由硬件清除中断发生后,并由RETI指令设置为启用后续中断。I位也可以通过带有SEI和CLI指令的应用程序,如中所述指令集引用。

进一步:

外部中断标志寄存器-EIFR

•位7..0–INTF6、INTF3-INTF0:外部中断标志6、3-0当INT[6;3:0]引脚上的边缘或逻辑变化触发中断请求,INTF7:0变为设置(一)。如果SREG中的I位和设置EIMSK中相应的中断使能位INT[6;3:0](一),MCU将跳转到中断向量。标志已清除当执行中断程序时。或者,标志可以是通过向其中写入逻辑标志来清除。这些标志总是被清除当INT[6;3:0]被配置为电平中断时。请注意,当在INT3:0中断被禁用的情况下进入睡眠模式,输入这些引脚上的缓冲区将被禁用。这可能会导致逻辑变化在将设置INTF3:0标志的内部信号中。

换句话说,当检测到另一个中断时,标志寄存器将设置该位,并在再次启用中断时(如果没有采取单独的操作,则从中断返回)执行该中断。

http://www.atmel.com/Images/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_%20Datasheet.pdf

如果你愿意,你可以实现在中断服务例程期间启用中断的代码,但你必须确保在这一点之后的代码是完全可重入的,和/或屏蔽当前中断(当你不久后没有得到另一个中断时,一些中断服务例程非常难以处理,如果你在该处理程序中得到另一次中断,那几乎是不可能的)。然而,通常情况下,正确的操作系统会启用所有其他中断,这意味着写入EIMSK寄存器。

一般来说,最好简单地在中断处理程序中收集必要的信息,将其存储在"安全"的地方(循环缓冲区很好),并发出新数据可用于系统中的常规任务的信号,并在那里处理数据。

[此外,据我所知,中断中没有任何东西可以停止函数调用-只要你了解自己在做什么,并且没有问题,例如从中断和常规代码同时调用函数]