Watchdog - 簡單的 WDT
材料準備
範例說明
在此範例中,我們將使用在AmebaD上運行的Watchdog計時器範例來說明如何使用Watchdog API。 在詳細介紹範例之前,我們先簡要介紹一下“Watchdog”的定義及其工作原理。
Watchdog
Watchdog Timer(WDT)是一種硬件定時器,用於檢測軟件故障的發生,然後在編程週期到期時自動生成系統重置或Watchdog中斷。
一般來說,想像一下您的微控制器陷入無限循環的混亂情況,或者像微控制器在執行某些任務時卡住的任何情況。 正常的故障排除方法是按下重置按鈕並跳出無限循環。 但是,實際上不可能一直都按下按鈕,因此,嵌入在微控制器內的Watchdog定時器將有助於解決這種情況。
Feed the Dog
如果您的家中有一隻狗。 您需要定期餵食。 如果一天不能餵食,它會咬你! 同樣,這是Watchdog定時器背後的工作邏輯。
在我們的範例中,我們創建了2個任務,其中包含一次又一次重複運行的循環,一個稱為Small_Task任務,另一個稱為Big_Task任務。 我們使Watchdog定時器的初始值(5秒)大於Small_Task任務的總延遲,但比Big_Task任務的延遲短。
對於Small_Task任務的情況,Watchdog將在5秒內刷新/餵食,但是,對於Big_Task任務的情況,循環正在處理中,並且Watchdog在5秒後仍不刷新,這會觸發Watchdog 以重置處理器。 同樣,Watchdog定時器可以保護微控制器免受卡住情況的影響。
然後我們開始說明本範例的編碼部分,對於本範例,您僅需要RTL8722CSM/RTL8722DM/RTL8722DM MINI開發板。
首先,確保在Arduino IDE中選擇了正確的Ameba開發板:“Tools”->“Board”->“RTL8722CSM/RTL8722DM”(或 “RTL8722DM MINI”)。 然後在“File”->“Examples”->“AmebaWatchdog”->“Watchdog Timer”中打開“Watchdog Timer”範例:
成功上傳範例代碼後,打開串行監視器,然後按重置按鈕。
您會發現Small_Task任務可以在5秒內刷新Watchdog(初始化Watchdog定時器)。 但是,Big_Task任務將無法在5秒內刷新Watchdog,這將導致微控制器重置。
NOTE:如果您在不同的平台(例如 macOS)上運行此範例,您可能會發現代碼在執行Big Task期間僅執行 4 個 dummy tasks,而不是上面指出的 5 個。 執行的dummy tasks數量取決於計算機處理速度。 各種處理器的處理速度可能會導致代碼編譯期間的處理時間不同。 在這種情況下,沒有必要比較 Ameba 被迫從Big Task重置之前完成了多少個任務。
您還可以將“#define RUN_CALLBACK_IF_WATCHDOG_BARKS (0)”值設置為“1”,用於自定義“my_watchdog_irq_handler”。 可以在處理程序中編寫代碼以執行。