使用noInterrupts()/ interrupts()块时哪些函数不起作用?

问题描述:

我在一个时间敏感的Arduino库中有一些代码,并且希望在noInterrupts()interrupts()之间保护它。该文档指出:使用noInterrupts()/ interrupts()块时哪些函数不起作用?

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

有什么(标准)功能不起作用的列表?特别是,我需要通过致电millis()来节省时间。 millis()后面的数字是否仍然更新?还是应该将它从noInterrupts()/ interrupts()块中移出?

这样看来from this answer,在特定millis()将由禁止中断被禁用,因为该呼叫依赖于一个在连接到该触发在大约1KHz的一个定时器中断。尽管我已经仔细阅读了官方文档,但没有找到可能受到影响的详尽清单。我相信很多人都对官方文件中这种明显缺乏感到沮丧。

进一步看,定时器(定时器/计数器0的ATmega文档中)控制millis()仍然中断是否允许或不在后台计数 - 问题是,如果你的代码跨越时候中断本可以解雇,你可能会错过。参见下面的参考。底线是如果您需要中断,请保留您的noInterrupts()部分简短。并保持你的代码附加到中断简要。 ;)无论您是使用草图还是裸机编码,始终保持中断快速进入和退出总是非常重要的。

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