我正在集思广益一个应用程序,在这个应用程序中,每秒可能有两个来自两个不同来源的中断(单独的中断),每个中断都运行一个函数,只需在计数中添加一个数字。我需要void loop()
对这些数据进行简单分析。我想知道在主循环运行时中断是否异步运行,或者它们是否在处理过程中停止了主循环?
我的主循环确实要求millis()
函数正常工作,我知道在the Arduino reference的中断中是不可能的,如果中断同步运行,我将不得不查看其他解决方案。
答案 0 :(得分:5)
我不确定你的意思是中断同步或异步运行。
当发生中断时,主程序停止,中断服务程序(ISR)在没有识别出新中断的模式下执行。离开ISR后,主程序将在中断的地方继续进行。
Arduino上无法实现真正的并行执行,因为ATMega是一个单核CPU,一次只能做一件事。但它可以快速切换:-)因此:
我的主循环确实需要millis()函数正常工作,
只要您不在ISR 内拨打millis()
,这是正常的,因为您的ISR
一个只为计数添加数字的函数
因此非常快。这不会打扰millis()
足以被任何人注意到。
答案 1 :(得分:1)
所有硬件外部中断都是异步的,这通常是中断背后的整个想法。现在,如果你问如何将它编码到你的循环中,我将不会有任何帮助,因为自从我玩任何ATMega芯片或Arduino以来,这是一段很长的时间。但看看链接。特别是关于中断的第12节。这假设您使用带有ATMega128的Ardunio,这是我认为最新的。
但是相同的概念适用于几乎所有的ATMega芯片,尤其是Arduino板中使用的芯片。该文档还提供了示例代码。如果你想充分利用芯片,这是一个必不可少的文件。