時間管理
阻止與非阻塞程式碼
對於非常簡單的草圖,使用 delay()
和 delayMicroseconds()
編寫阻塞程式碼可能是合適的。當事情變得更復雜時,使用這些功能可能會有一些缺點。其中一些是:
- 浪費 CPU 時間:在等待 LED 閃爍週期結束時,更復雜的草圖可能需要 CPU 處理其他內容。
- 意外延遲:在明顯呼叫的子程式中呼叫
delay()
時,例如在包含的庫中。 - 在延遲期間發生的丟失事件並且不由中斷處理程式處理,例如輪詢按鈕按下:按鈕可能被按下 100 毫秒,但這可能被
delay(500)
遮蔽。
實施細節
millis()
通常依賴於硬體定時器,其執行速度遠高於 1 kHz。當呼叫 millis()
時,實現會返回一些值,但是你不知道它實際上有多大。 當前毫秒可能剛剛啟動,或者它將在該函式呼叫之後立即結束。這意味著,當計算 millis()
的兩個結果之間的差異時,你可以在幾乎零到幾乎一毫秒之間的任何時間偏離。如果需要更高的精度,請使用 micros()
。
檢視 elapsedMillis
的原始碼可以發現它確實在內部使用 millis()
來比較兩個時間點,因此它也會受到這種影響。同樣,從同一個庫中可以獲得更高精度的替代 elapsedMicros
。