如何在Arduino中处理中断?

时间:2011-10-28 23:17:36

标签: asynchronous embedded arduino

我正在集思广益一个应用程序,在这个应用程序中,每秒可能有两个来自两个不同来源的中断(单独的中断),每个中断都运行一个函数,只需在计数中添加一个数字。我需要void loop()对这些数据进行简单分析。我想知道在主循环运行时中断是否异步运行,或者它们是否在处理过程中停止了主循环?

我的主循环确实要求millis()函数正常工作,我知道在the Arduino reference的中断中是不可能的,如果中断同步运行,我将不得不查看其他解决方案。

2 个答案:

答案 0 :(得分:5)

我不确定你的意思是中断同步或异步运行。

当发生中断时,主程序停止,中断服务程序(ISR)在没有识别出新中断的模式下执行。离开ISR后,主程序将在中断的地方继续进行。

Arduino上无法实现真正​​的并行执行,因为ATMega是一个单核CPU,一次只能做一件事。但它可以快速切换:-)因此:

  

我的主循环确实需要millis()函数正常工作,

只要您不在ISR 内拨打millis() ,这是正常的,因为您的ISR

  

一个只为计数添加数字的函数

因此非常快。这不会打扰millis()足以被任何人注意到。

答案 1 :(得分:1)

所有硬件外部中断都是异步的,这通常是中断背后的整个想法。现在,如果你问如何将它编码到你的循环中,我将不会有任何帮助,因为自从我玩任何ATMega芯片或Arduino以来,这是一段很长的时间。但看看链接。特别是关于中断的第12节。这假设您使用带有ATMega128的Ardunio,这是我认为最新的。

但是相同的概念适用于几乎所有的ATMega芯片,尤其是Arduino板中使用的芯片。该文档还提供了示例代码。如果你想充分利用芯片,这是一个必不可少的文件。

ATMega 168 Documentation