時間管理

阻止與非阻塞程式碼

對於非常簡單的草圖,使用 delay()delayMicroseconds() 編寫阻塞程式碼可能是合適的。當事情變得更復雜時,使用這些功能可能會有一些缺點。其中一些是:

  • 浪費 CPU 時間:在等待 LED 閃爍週期結束時,更復雜的草圖可能需要 CPU 處理其他內容。
  • 意外延遲:在明顯呼叫的子程式中呼叫 delay() 時,例如在包含的庫中。
  • 在延遲期間發生的丟失事件並且不由中斷處理程式處理,例如輪詢按鈕按下:按鈕可能被按下 100 毫秒,但這可能被 delay(500) 遮蔽。

實施細節

millis() 通常依賴於硬體定時器,其執行速度遠高於 1 kHz。當呼叫 millis() 時,實現會返回一些值,但是你不知道它實際上有多大。 當前毫秒可能剛剛啟動,或者它將在該函式呼叫之後立即結束。這意味著,當計算 millis() 的兩個結果之間的差異時,你可以在幾乎零到幾乎一毫秒之間的任何時間偏離。如果需要更高的精度,請使用 micros()

檢視 elapsedMillis 的原始碼可以發現它確實在內部使用 millis() 來比較兩個時間點,因此它也會受到這種影響。同樣,從同一個庫中可以獲得更高精度的替代 elapsedMicros