我有一个阿迪诺·尤诺 (很棒的小设备!)它有两个中断;我们称它们为和1。我使用attachInterrupt()
:http://www.arduino.cc/en/Reference/AttachInterrupt附加了一个用于中断0的处理程序,另一个用于中断1的处理程序。
中断被触发,并调用它的处理程序,该处理程序进行一些数字处理。如果中断的处理程序在触发1时仍在执行,那么会发生什么情况?
中断1中断,还是中断1等待中断的处理程序执行完毕?
请注意,这一问题具体涉及到Arduino。
发布于 2011-02-24 22:44:58
在Arduino (又名AVR)硬件上,嵌套中断是不会发生的,除非您有意创建允许中断发生的条件。
来自avr-lib:
AVR硬件在进入中断向量之前清除SREG中的全局中断标志。因此,正常情况下,中断将在处理程序中保持禁用,直到处理程序退出为止,在该处理程序中,RETI指令(由编译器作为中断处理程序正常函数后记的一部分发出)最终将重新启用进一步的中断。因此,中断处理程序通常不嵌套。对于大多数中断处理程序来说,这是所需的行为,对于某些中断来说,这甚至是为了防止无限递归中断(比如UART中断,或级别触发的外部中断)。在罕见的情况下,可能希望在中断处理程序中尽早重新启用全局中断标志,以避免任何其他中断的延迟超过绝对需要。这可以在中断处理程序开始时使用sei()指令来完成,但在编译器生成的函数序言中仍然没有几条指令可以在禁用全局中断的情况下运行。
(资料来源:中断 )
发布于 2016-03-07 06:47:25
中断1中断0,还是中断1等待中断0的处理程序执行?
除非您在ISR (中断服务例程)中特别地重新启用中断,否则无论当前运行的中断是什么,在下一个中断被服务之前,加上另外一个机器代码指令。
大多数中断在处理器内部设置一个标志,在指令之间进行检查,以确定是否应该对中断进行服务。将按优先级顺序检查标志。在联合国内罗毕办事处,即:
1 Reset
2 External Interrupt Request 0 (pin D2) (INT0_vect)
3 External Interrupt Request 1 (pin D3) (INT1_vect)
4 Pin Change Interrupt Request 0 (pins D8 to D13) (PCINT0_vect)
5 Pin Change Interrupt Request 1 (pins A0 to A5) (PCINT1_vect)
6 Pin Change Interrupt Request 2 (pins D0 to D7) (PCINT2_vect)
7 Watchdog Time-out Interrupt (WDT_vect)
8 Timer/Counter2 Compare Match A (TIMER2_COMPA_vect)
9 Timer/Counter2 Compare Match B (TIMER2_COMPB_vect)
10 Timer/Counter2 Overflow (TIMER2_OVF_vect)
11 Timer/Counter1 Capture Event (TIMER1_CAPT_vect)
12 Timer/Counter1 Compare Match A (TIMER1_COMPA_vect)
13 Timer/Counter1 Compare Match B (TIMER1_COMPB_vect)
14 Timer/Counter1 Overflow (TIMER1_OVF_vect)
15 Timer/Counter0 Compare Match A (TIMER0_COMPA_vect)
16 Timer/Counter0 Compare Match B (TIMER0_COMPB_vect)
17 Timer/Counter0 Overflow (TIMER0_OVF_vect)
18 SPI Serial Transfer Complete (SPI_STC_vect)
19 USART Rx Complete (USART_RX_vect)
20 USART, Data Register Empty (USART_UDRE_vect)
21 USART, Tx Complete (USART_TX_vect)
22 ADC Conversion Complete (ADC_vect)
23 EEPROM Ready (EE_READY_vect)
24 Analog Comparator (ANALOG_COMP_vect)
25 2-wire Serial Interface (I2C) (TWI_vect)
26 Store Program Memory Ready (SPM_READY_vect)
(请注意,不能掩盖重置)。
可以想象,一个低级的中断可能正在进行中。TIMER0_OVF_vect)。当它忙于完成它的工作时,可能会发生多个其他中断事件(并在CPU中设置相应的位)。它们将按上述顺序服务,而不是按它们实际发生的时间顺序服务。
有硬件寄存器可以写入,以取消挂起的中断-也就是说,清除标志。
提到“多一台机器代码指令”的原因是,处理器的设计是为了保证当它从未启用的中断过渡到启用中断时,始终会执行另一条指令。
这允许您编写如下代码:
interrupts (); // guarantees next instruction executed
sleep_cpu (); // sleep now
如果没有这种情况,睡眠前可能会发生中断。这意味着你永远不会醒来,因为你依赖的是睡眠中发生的中断,而不是它之前的中断。
飞思卡尔和爱特梅尔都用同样的指令名,但却有倒置的意思,这真是太妙了。
这就是为什么我更喜欢interrupts
和noInterrupts
的助记符,因为它们的意图非常明确。这些都是由核心包含文件中的定义实现的。
发布于 2016-02-03 08:42:58
https://stackoverflow.com/questions/5111393
复制相似问题