2020年2月12日 星期三

MicroPython on ESP32 學習筆記 (十三) : 看門狗計時器 WDT (on v1.12)

昨天在 ESP32 上燒錄 MicroPython v1.12 版韌體後, 確認此版開始支援 BLE 藍芽, 這實在太棒了, 可惜我對藍芽協定及其操作仍很陌生, 等學習原理後再來測試. 反倒是想了一個程式來測試看門狗計時器 (Watch dog, WDT), 前次的測試參考 :

MicroPython on ESP32 學習筆記 (六) : 看門狗計時器 WDT

更多 ESP32 上的 MicroPython 測試參考 :

MicroPython on ESP32 學習筆記索引

使用看門狗須從 machine 套件匯入 WDT 類別, 然後呼叫建構子 WDT() 並傳入 timeout 參數指定看門狗計時器的逾時毫秒數, 它會傳回一個 WDT 物件, WDT 物件一建立即開始計時, 必須在計時器逾時前呼叫其 feed() 方法將計時器歸零, 否則計時器將重置 (reset) 系統 :

from machine import WDT    #匯入 WDT 類別
wdt=WDT(timeout=20000)     #建立 WDT 物件開始計時
wdt.feed()                                  #WDT 計時器歸零

看門狗計時器主要被用來偵測應用程式是否咬死或系統當機, 因此要將 feed() 放在任務執行結束時呼叫, 如果發生系統當機就無法呼叫 feed(), 這樣就會導致系統重啟, 讓程式能重新新執行避免僵在那裏失去功能.

下面範例使用一個無窮迴圈來模擬看門狗計時器的用途 :

#main.py
from machine import WDT
import time
wdt=WDT(timeout=20000)
i=0
while True:
    i=i+1
    print(i)
    if i == 21:
        wdt.feed()
        i=0
    time.sleep(1)

此程式從 machine 匯入 WDT, 設定了 20 秒的看門狗計時器, 另外還匯入 time 模組, 用來在迴圈中以 time.sleep(1) 計時 1 秒.

此例用 while True 建構一個無窮迴圈, 執行時會印出秒數, 當秒數到 21 秒時呼叫 feed() 的方法來重置 WDT 計時器避免系統重啟, 但這不會成真, 因為數到 20 秒時 WDT 計時器就因逾時而重啟系統, 程式又重新執行了, 所以這個無窮迴圈根本沒有機會執行 wdt.feed() 指令. 若將程式改為第 19 秒就重置 WDT 計時器, 系統就不會重啟了.

將此程式存成 main.py, 然後用 ampy 傳送至檔案系統根目錄下 :

D:\test>ampy --port COM8 put main.py

參考

MicroPython on ESP32 學習筆記 (二) : 檔案系統

開啟 PuTTY 連線 COM 埠,  結果如下 :






I (531) cpu_start: Pro cpu up.
I (531) cpu_start: Application information:
I (531) cpu_start: Compile time:     Feb 11 2020 00:37:56
I (534) cpu_start: ELF file SHA256:  0000000000000000...
I (540) cpu_start: ESP-IDF:          v3.3.1
I (545) cpu_start: Starting app cpu, entry point is 0x400836ec
I (535) cpu_start: App cpu up.
I (556) heap_init: Initializing. RAM available for dynamic allocation:
I (563) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM
I (569) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM
I (575) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM
I (581) heap_init: At 3FFBDB5C len 00000004 (0 KiB): DRAM
I (587) heap_init: At 3FFCC810 len 000137F0 (77 KiB): DRAM
I (593) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (599) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (606) heap_init: At 40099A80 len 00006580 (25 KiB): IRAM
I (612) cpu_start: Pro cpu start user code
I (295) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
1
2
3
4
5
....
17
18
19
20
(reset)

注意, 由於此程式為無窮迴圈, 因此無法再用 ampy 上傳新的 main.py 覆蓋掉, 必須重新燒錄韌體才行.

沒有留言 :