时间管理

阻止与非阻塞代码

对于非常简单的草图,使用 delay()delayMicroseconds() 编写阻塞代码可能是合适的。当事情变得更复杂时,使用这些功能可能会有一些缺点。其中一些是:

  • 浪费 CPU 时间:在等待 LED 闪烁周期结束时,更复杂的草图可能需要 CPU 处理其他内容。
  • 意外延迟:在明显调用的子程序中调用 delay() 时,例如在包含的库中。
  • 在延迟期间发生的丢失事件并且不由中断处理程序处理,例如轮询按钮按下:按钮可能被按下 100 毫秒,但这可能被 delay(500) 遮蔽。

实施细节

millis() 通常依赖于硬件定时器,其运行速度远高于 1 kHz。当调用 millis() 时,实现会返回一些值,但是你不知道它实际上有多大。 当前毫秒可能刚刚启动,或者它将在该函数调用之后立即结束。这意味着,当计算 millis() 的两个结果之间的差异时,你可以在几乎零到几乎一毫秒之间的任何时间偏离。如果需要更高的精度,请使用 micros()

查看 elapsedMillis 的源代码可以发现它确实在内部使用 millis() 来比较两个时间点,因此它也会受到这种影响。同样,从同一个库中可以获得更高精度的替代 elapsedMicros