標籤: Arduino

ESP8266 WatchDog

No Comments

ESP8266 有兩隻 watchdogs,其一是 software,另一是 hardware,預設都是開啟的。
絕大部份人建議留著不關。一方面以避免程設邏輯錯誤或盲點所造成的無窮迴圈;一方面也可避免即便邏輯正確但仍可能造成 starvation 的狀況例如無止盡地接續中斷;再另一方面也利於糾除錯。
然而仍有需其關掉的場合。程設下的各種可能性誠然不可因噎廢食或蓋棺論定。筆者是站在可關的立場。

  • 經實測,
  • SoftwareWDT,時間是約 2.2 秒後 timeout software wdt-reset,
  • HardwareWDT,時間是約 8 秒後 timeout hardware wdt-reset,
  • 還有一個終極時間,後面會提到,時間是 71 秒,
  • 發生 software wdt reset,rst cause 是 2 號,
  • 發生 hardware wdt reset,rst cause 是 4 號,
  • 關於使用者自訂 watchdog 的行為,必須在 loop() 內做,因為在 setup() 執行之後預定有做了一些 watchdog 的設定因此在 setup() 內做的可能就會被異動。
  • 一些用法及說明如下,
  • FEED:
  • system_soft_wdt_feed() 可以 reset wdt timer。因此需在 software wdt reset 發生前執行過 feed,即,2.2 秒內,就會重新開始計時於該處爭取更多運算時間。故可搭配反覆 feed 使得 CPU 能夠全時專注在某段程式碼。
  • 它同時有效於 software wdt & hardware wdt。
  • 換言之,至此看到,除非 software wdt 被關掉,不然 hardware wdt reset 是永遠不可能發生因為 software wdt reset 會先發生。又,經驗下我們曾看過 4 號 reset,為何?很可能是 software wdt 被某函式庫中的程式短暫關掉,又陷入坑,才會引發 hardware wdt reset。
  • sketch loop(),一定是被呼叫於另一外圈主程式中。故離開 loop(),勢必會作 feed。arduino watch dog 運作邏輯也是基於此;不該卡死在 loop() 內。
  • 關開 hardware wdt:
  • 如以下程式片斷,
IRAM_ATTR volatile unsigned &HardwareWDT = *((volatile unsigned*)0x60000900);
#define disableHardwareWDT  (HardwareWDT&=~1)
#define enableHardwareWDT   (HardwareWDT|=1)
  • 關開 software wdt:
  • system_soft_wdt_stop()
  • system_soft_wdt_restart()
  • 很不幸地:
  • 我們針對 hardware wdt 是直接存取 memory mapped io,故應是沒有什麼疑慮。
  • 但關掉 software wdt,是呼叫官方 sdk,因官方仍不放心,僅將 software wdt 設定成 71 秒後切換回預設的 2.2 秒 enabled,並且在此 71 秒間作 feed 是無作用的。轉圜的解法是在 timeout 前,將 software wdt 再打開,再關掉,便重新計時 71 秒。(注意這裏是無關乎 hardware wdt,即,若關掉 hardware wdt,則如這段所述;若不關 hardware wdt,則要不是先 hardware wdt reset[若無 feed],要不就是有 feed,但會在第 71 秒 software wdt reset[不過若有恰 2.2 秒內 feed 不會 reset]。除非在這時間點及之後每 2.2 秒內對 software wdt 作 feed)。

Categories: Arduino

Tags: ,

PHP Code Snippets Powered By : XYZScripts.com