星期四, 11月 16, 2017

小心, ESP8266 有看門狗 (Watch Dog Timer)

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();}  
}

3 則留言:

Tc Huang 提到...

敬啟者 你好:
在網路上看到你的大作,剛好我有遇到一個類似的問題,想向你請教一下,看你有沒有類似的經驗可以解決?後面的訊息是我把Arduino IDE中最基本的範例Blink燒進ESP8266 ESP-202這塊模組板後,在監控視窗上所看到的訊息,但我之前買的同樣一塊板子就不會有這個現象,不知道會是什麼原因,該如何解決呢?還請賜教一下,謝謝.

ets Jan 8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld

meebox 提到...

應該不是我文章中程式沒有重置看門狗的問題, 因為 blink 程式在 loop 中不會有什麼延遲, 而每次 loop() 都會更新看門狗。會不會是這片板子製作時的瑕疵?依據網路上找到的資訊, 可以試看看從 3.3V 接 1 個 10KΩ電阻到 GPIO0 再 reset 是不是可以正常運作?

潘宗轅 提到...

路過,學到,讚!