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

时间:2014-09-19 06:30:43

标签: c++ c arduino interrupt

我正在编程arduino,我在pin2下降沿附加了一个中断。当我在ISR并且ISR没有执行所有线路。在完成所有线路之前如果再次出现下降边缘会发生什么?中断是从开始还是忽略而开始的。这里我说的只是针对pin2的中断。

1 个答案:

答案 0 :(得分:4)

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标志。

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

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

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

作为一般规则,最好只是在中断处理程序中收集必要的信息,将其存储在" safe" place(循环缓冲区对此有利),并表示新数据可用于系统中的常规任务,并在那里处理数据。

[另外,据我所知,在中断内部没有任何停止函数调用 - 只要你明白你在做什么,并且没有问题,例如从中断和常规调用函数代码同时]