使用noInterrupts()/ interrupts()块时哪些功能不起作用?

时间:2017-07-10 19:59:44

标签: arduino interrupt

我在Arduino库中有一些时间敏感的代码,并希望在noInterrupts()interrupts()之间保护它。文档说明:

  

禁用中断时某些功能不起作用,可能会忽略传入通信。

是否列出了哪些(标准)功能不起作用?特别是,我需要通过调用millis()来节省时间。 millis()后面的数字是否仍在更新,还是应该将它移出noInterrupts()/ interrupts()块?

1 个答案:

答案 0 :(得分:3)

from this answer看起来millis()会因禁用中断而被禁用,因为该调用依赖于连接到计时器的中断,该计时器在大约时触发1KHz的。我虽然仔细研究了官方文档,却找不到可能会受到影响的详尽清单。我确信很多人对官方文件中明显缺乏这一点感到沮丧。

进一步看,控制millis() 的定时器(ATmega文档中的定时器/计数器0)仍然在后台计算是否启用了中断 - 问题是,如果你的代码跨越中断会被触发的时间,你可能会错过一个勾号。见下面的参考文献。

底线是,如果您需要中断,请保持noInterrupts()部分简短。并保持附加到中断的代码更简洁。 ;)无论您是使用草图还是裸机进行编码,保持中断快速进出总是很重要。

external reference is also interesting, shows the math and code behind the millis().

相关问题