ESP8266 雖然有 Arduino Core 可以直接用 Arduino IDE 寫程式, 不過 ESP8266 畢竟不是 Arduino, 有些硬體上的差異還是可能讓你的程式掛掉, 今天就遇到一個搞死我的問題。我有一個機器人的程式, 跑一些動作時 ESP2866 就會 reset, 本來以為是供電不足, 但馬達單獨供電還是會 reset, 開了 Serial 看資料才發現, reset 時有以下訊息:
Soft WDT reset
ctx: cont
....
原來 ESP8266 有看門狗計時器 (Watch Dog Timer), 程式會在 loop() 結束或是呼叫 delay() 時更新看門狗計時器, 如果很長一段時間沒有更新看門狗計時器, 就會啟動 reset 機制, 警告你程式某些地方有閒置過久的問題。舉例來說, 如果你在 ESP8266 上跑以下這個在 loop() 中閒置 10 秒的程式:
void setup() {
Serial.begin(9600);
Serial.println("Begin testing");
}
unsigned long prevTime;
void loop() {
prevTime = millis();
while(millis() - prevTime < 10000);
}
就會在序列埠監控視窗中看到看門狗計時器 reset 的訊息:
解決的方法很簡單, 只要在閒置區域中呼叫 yield() 或是 delay(0) 就會更新看門狗計時器, 也就不會 reset 了。修改的程式如下:
void setup() {
Serial.begin(9600);
Serial.println("Begin testing");
}
unsigned long prevTime;
void loop() {
prevTime = millis();
while(millis() - prevTime < 10000) {yield();}
}