时间管理
阻止与非阻塞代码
对于非常简单的草图,使用 delay()
和 delayMicroseconds()
编写阻塞代码可能是合适的。当事情变得更复杂时,使用这些功能可能会有一些缺点。其中一些是:
- 浪费 CPU 时间:在等待 LED 闪烁周期结束时,更复杂的草图可能需要 CPU 处理其他内容。
- 意外延迟:在明显调用的子程序中调用
delay()
时,例如在包含的库中。 - 在延迟期间发生的丢失事件并且不由中断处理程序处理,例如轮询按钮按下:按钮可能被按下 100 毫秒,但这可能被
delay(500)
遮蔽。
实施细节
millis()
通常依赖于硬件定时器,其运行速度远高于 1 kHz。当调用 millis()
时,实现会返回一些值,但是你不知道它实际上有多大。 当前毫秒可能刚刚启动,或者它将在该函数调用之后立即结束。这意味着,当计算 millis()
的两个结果之间的差异时,你可以在几乎零到几乎一毫秒之间的任何时间偏离。如果需要更高的精度,请使用 micros()
。
查看 elapsedMillis
的源代码可以发现它确实在内部使用 millis()
来比较两个时间点,因此它也会受到这种影响。同样,从同一个库中可以获得更高精度的替代 elapsedMicros
。