Arduino如何处理中断?

Posted

技术标签:

【中文标题】Arduino如何处理中断?【英文标题】:How are Interrupts handled in Arduino? 【发布时间】:2011-10-28 23:17:35 【问题描述】:

我正在头脑风暴一个应用程序,其中每秒可能有来自两个不同来源(单独的中断)的多个中断,每个中断都运行一个简单地将一个数字添加到计数的函数。我需要我的void loop() 来使用该数据执行简单的分析。我想知道中断是否在主循环运行时异步运行,或者它们是否在处理过程中停止了主循环?

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

【问题讨论】:

当您深入了解使用微控制器的技术细节时,我们有很多专家,并且已经在 electronics.stackexchange.com 上回答了问题 感谢 Kortuk!我真的很喜欢那个网站,只是觉得这实际上是更高级别的! 很明显你收到了你的答案,但是这种功能的中断和定时功能是话题。在这里收到快速而优质的答案证明您确实有自己的选择。 【参考方案1】:

我不确定您所说的中断同步或异步运行是什么意思。

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

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

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

只要你不在 ISR 中调用 millis() 就可以了,因为你的 ISR 是

一个简单地将数字添加到计数的函数

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

【讨论】:

太棒了。我知道您可以在单核计算机处理器上运行异步事物,因为它们以我无法想象的方式安排任务。我不知道这是否真的转移到了 ATMega。 @A.H.,如果他正在读取秒数并读取毫秒,他的中断可以让他读取毫秒并在片刻后读取秒,或者源的某些东西,为 UP 考虑的东西至少。【参考方案2】:

所有硬件外部中断都是异步的,这通常是中断背后的全部想法。现在,如果您要问如何将其编码到您的循环中,我将无济于事,因为我已经很久没有使用任何 ATMega 芯片或 Arduino 了。但是看看链接。特别是关于中断的第 12 节。这是假设您使用带有 ATMega128 的 Ardunio,我相信这是最新的。

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

ATMega 168 Documentation

【讨论】:

以上是关于Arduino如何处理中断?的主要内容,如果未能解决你的问题,请参考以下文章

Atmel Studio 中的 Arduino 产量

如何处理unique_ptr?

Arduino-中断

Arduino系列之中断函数

如何为pyserial读取运行线程

安卓开发蓝牙接收数据,返回数据如何处理