嵌入式與裸機

看門狗計時器(watchdog timer)

想像一位夜間守衛,必須每十分鐘打一通電話給保全辦公室確認一切無恙。若有一通電話沒打,辦公室就認定出事了並派人支援。看門狗計時器是微控制器內部這套安排的硬體版:一個倒數計時器,若它曾被放任倒數到零,就認定軟體已當機或卡死,並強制重置整顆晶片以恢復它。

機制上很簡單,而那份簡單正是它的力量。看門狗是一個與主程式流程分離的硬體計數器,靠自己的時鐘倒數(或計數到一個上限)。你的軟體必須週期性地「踢」或「餵」看門狗——在它到期前往它的暫存器寫入一個特定值以重設計數。只要程式正常執行、及時抵達它的踢點,計數器就永遠到不了零,什麼也不會發生。但若軟體卡在無窮迴圈、死結、在一次干擾後迷失,或當機到停止踢狗,計數器就會到期,看門狗便觸發硬體重置,從重置向量重新啟動系統。因為看門狗跑在獨立硬體上,即使 CPU 卡死它也能運作。良好實務是從一個精選的地方(常是主迴圈)踢它,「不」散落各處,這樣只有部分任務死掉的局部卡死仍能被抓到。許多晶片也有窗型看門狗,若你踢得太「早」或太晚都會觸發錯誤,藉此抓出瘋狂猛踢的失控迴圈。

它之所以重要,是因為嵌入式裝置常無人看管地連續運作數年,沒人能按重置鈕——看門狗是把卡死的裝置變回可用的自動最後手段。誠實的提醒:看門狗是安全網而「非」修復——它靠重新啟動掩蓋當機,所以每隔幾分鐘就默默重置的裝置是壞的,你應該找出真正的臭蟲,而非只依賴重置。從中斷內或從太多地方踢看門狗可能掩蓋真正的卡死(即使主工作已停滯,踢仍持續發生),違背了它的目的。而看門狗重置後你通常會想記錄它發生過(一個重置原因旗標),好讓故障可見而非被藏起來。

// 獨立的硬體計數器;軟體必須及時踢它。 iwdg_init(/* 逾時 = */ 500 /* ms */); for (;;) { do_main_work(); // 若這裡卡死超過 500 ms ... iwdg_kick(); // ... 這行就不會被執行到,於是 } // 看門狗重置整顆晶片。 // 從「一個」地方踢,不要在 ISR 裡,這樣真正的卡死才會被抓到。

若主迴圈卡死、停止踢狗,獨立的看門狗計數器到期並重置晶片——無人在場的自動恢復。

看門狗靠重新啟動隱藏當機;它不是修復。從 ISR 或太多地方踢它可能掩蓋真正的卡死,所以反覆默默重置的裝置是壞的——記錄重置原因並找出真正的臭蟲。

又稱
watchdogWDTcomputer operating properly timerCOP timer看門狗監控計時器