首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >中断会打断其他人对Arduino的干扰吗?

中断会打断其他人对Arduino的干扰吗?
EN

Stack Overflow用户
提问于 2011-02-24 22:34:32
回答 3查看 33.3K关注 0票数 26

我有一个阿迪诺·尤诺 (很棒的小设备!)它有两个中断;我们称它们为和1。我使用attachInterrupt()http://www.arduino.cc/en/Reference/AttachInterrupt附加了一个用于中断0的处理程序,另一个用于中断1的处理程序。

中断被触发,并调用它的处理程序,该处理程序进行一些数字处理。如果中断的处理程序在触发1时仍在执行,那么会发生什么情况?

中断1中断,还是中断1等待中断的处理程序执行完毕?

请注意,这一问题具体涉及到Arduino。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-24 22:44:58

在Arduino (又名AVR)硬件上,嵌套中断是不会发生的,除非您有意创建允许中断发生的条件。

来自avr-lib:

AVR硬件在进入中断向量之前清除SREG中的全局中断标志。因此,正常情况下,中断将在处理程序中保持禁用,直到处理程序退出为止,在该处理程序中,RETI指令(由编译器作为中断处理程序正常函数后记的一部分发出)最终将重新启用进一步的中断。因此,中断处理程序通常不嵌套。对于大多数中断处理程序来说,这是所需的行为,对于某些中断来说,这甚至是为了防止无限递归中断(比如UART中断,或级别触发的外部中断)。在罕见的情况下,可能希望在中断处理程序中尽早重新启用全局中断标志,以避免任何其他中断的延迟超过绝对需要。这可以在中断处理程序开始时使用sei()指令来完成,但在编译器生成的函数序言中仍然没有几条指令可以在禁用全局中断的情况下运行。

(资料来源:中断 )

票数 28
EN

Stack Overflow用户

发布于 2016-03-07 06:47:25

中断1中断0,还是中断1等待中断0的处理程序执行?

除非您在ISR (中断服务例程)中特别地重新启用中断,否则无论当前运行的中断是什么,在下一个中断被服务之前,加上另外一个机器代码指令

大多数中断在处理器内部设置一个标志,在指令之间进行检查,以确定是否应该对中断进行服务。将按优先级顺序检查标志。在联合国内罗毕办事处,即:

代码语言:javascript
运行
复制
 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中设置相应的位)。它们将按上述顺序服务,而不是按它们实际发生的时间顺序服务。

有硬件寄存器可以写入,以取消挂起的中断-也就是说,清除标志。

提到“多一台机器代码指令”的原因是,处理器的设计是为了保证当它从未启用的中断过渡到启用中断时,始终会执行另一条指令。

这允许您编写如下代码:

代码语言:javascript
运行
复制
  interrupts ();             // guarantees next instruction executed
  sleep_cpu ();              // sleep now

如果没有这种情况,睡眠前可能会发生中断。这意味着你永远不会醒来,因为你依赖的是睡眠中发生的中断,而不是它之前的中断。

飞思卡尔和爱特梅尔都用同样的指令名,但却有倒置的意思,这真是太妙了。

这就是为什么我更喜欢interruptsnoInterrupts的助记符,因为它们的意图非常明确。这些都是由核心包含文件中的定义实现的。

票数 8
EN

Stack Overflow用户

发布于 2016-02-03 08:42:58

文献资料提到Arduino中断有优先权:

如果您的草图使用多个ISRs,一次只能运行一个。其他中断将在当前中断以取决于其所具有的优先级的顺序完成后执行。

它还提供了一个关于其他信息的链接:

有关中断的更多信息,请参见尼克·加蒙笔记

根据节,什么是中断优先级?可以在中断被禁用时发生中断?,我们可以得出结论:

  1. 中断是基于标志列表的。当事件发生时,将设置相应的标志。
  2. 如果ISR现在无法启动,则可以在以后的任何时候调用它,因为标记已经保存。
  3. 有一个列表,所有可用的中断,它通常取决于芯片。列表越高,优先级就越高。

因此,不同的中断不会互相打断。他们将按照自己的优先顺序被处决。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5111393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档