我正在编程arduino,我在pin2下降沿附加了一个中断。当我在ISR并且ISR没有执行所有线路。在完成所有线路之前如果再次出现下降边缘会发生什么?中断是从开始还是忽略而开始的。这里我说的只是针对pin2的中断。
答案 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(循环缓冲区对此有利),并表示新数据可用于系统中的常规任务,并在那里处理数据。
[另外,据我所知,在中断内部没有任何停止函数调用 - 只要你明白你在做什么,并且没有问题,例如从中断和常规调用函数代码同时]