【问题标题】:Which functions don't work when using a noInterrupts() / interrupts() block?使用 noInterrupts() / interrupts() 块时哪些功能不起作用?
【发布时间】:2017-07-10 19:59:44
【问题描述】:

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

当中断被禁用时,某些功能将无法工作,传入的通信可能会被忽略。

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

【问题讨论】:

    标签: arduino interrupt


    【解决方案1】:

    看起来from this answer 尤其是millis() 将通过禁用中断来禁用,因为该调用依赖于附加到以大约 1KHz 触发的计时器的中断。不过,我已经仔细阅读了官方文档,但没有找到可能受到影响的详尽列表。我相信很多人都对官方文档中明显的缺失感到沮丧。

    进一步看,控制millis() 的计时器(ATmega 文档中的 Timer/Counter 0)仍然在后台计数无论是否启用中断 -- 问题是,如果您的代码跨越中断会触发的时间,您可能会错过一个滴答声。请参阅下面的参考资料。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多