在由單片機構成的微型計算機系統中,由於單片機的工作常常會受到來自外界電磁場的干擾,造成各種寄存器和內存的數據混亂,會導致程序指針錯誤,不在程序區,取出錯誤的程序指令等,都有可能會陷入死循環,程序的正常運行被打斷,由單片機控制的系統無法繼續正常工作,導致整個系統的陷入停滯狀態,發生不可預料的后果。
看門狗的功能是定期的查看芯片內部的情況,一旦發生錯誤就向芯片發出重啟信號。看門狗命令在程序的中斷中擁有最高的優先級。
定義
看門狗,又叫watchdog timer,是一個定時器電路,一般有一個輸入,叫喂狗(kicking the dog/service the dog),一個輸出到MCU的RST端,MCU正常工作的時候,每隔一段時間輸出一個信號到喂狗端,給 WDT清零,如果超過規定的時間不喂狗(一般在程序跑飛時),WDT定時超過,就會給出一個復位信號到MCU,使MCU復位。防止MCU死機. 看門狗的作用就是防止程序發生死循環,或者說程序跑飛。
基本原理
看門狗是一種監控系統的運行狀況的手段,通過軟硬件結合的方式實現對系統運行狀況的監控。穩定運行的軟件會在執行完特定指令后進行喂狗,若在一定周期內看門狗沒有收到來自軟件的喂狗信號,則認為系統故障,會進入中斷處理程序或強制系統復位。系統上電后根據不同的工作模式可以選擇使能看門狗的時機,若看門狗被使能則計數器開始計數,如果在設定的時間內沒有及時喂狗則會發生看門狗超時。看門狗主要由寄存器、計數器和狗叫模塊構成:通過寄存器對看門狗進行基本設置,計數器計算狗叫時間,狗叫模塊決定看門狗超時后發出的中斷或復位方式。
應用
看門狗電路的應用,使單片機可以在無人狀態下實現連續工作,其工作原理是:看門狗芯片和單片機的一個I/O引腳相連,該I/O引腳通過程序控制它定時地往看門狗的這個引腳上送入高電平(或低電平),這一程序語句是分散地放在單片機其他控制語句中間的,一旦單片機由於干擾造成程序跑飛后而陷入某一程序段進入死循環狀態時,寫看門狗引腳的程序便不能被執行,這個時候,看門狗電路就會由於得不到單片機送來的信號,便在它和單片機復位引腳相連的引腳上送出一個復位信號,使單片機發生復位。即程序從程序存儲器的起始位置開始執行,這樣便實現了單片機的自動復位。
分類
硬件看門狗
硬件看門狗是利用了一個定時器,來監控主程序的運行,也就是說在主程序的運行過程中,我們要在定時時間到之前對定時器進行復位。如果出現死循環,或者說PC指針不能回來,那么定時時間到后就會使單片機復位。常用的WDT芯片如MAX813,5045,IMP 813等。
軟件看門狗
而在某些情況下,也會采用純軟件的方法來設置看門狗,如在單片機系統中,利用閑置的定時器/計數器就可以設計一個軟件看門狗。具體實現步驟如下:
首先,在初始化程序中設置定時器/計數器的方式以控制寄存器(TMOD) 和定時時間的初值,並且打開中斷。
然后,根據定時器的時間,在主程序中按一定的時間間隔插入復位定時器的指令(喂狗), 兩條喂狗指令之間的時間間隔可以根據系統時鍾與指令周期計算出來,而且該時間周期應該小於定時器的定時時間。
最后,在定時器的中斷服務程序中,設置一條無條件轉移指令,將程序計數器PC轉移到初始化程序的入口。
在非單片機系統,如PowerPC系統中,也可以采用多線程的方式來設置軟件狗,其主要的步驟如下所述:
首先,新建一個看門狗線程,該線程維護一個全局變量數組,該數組相當於每個工作線程的計數器。看門狗線程為一一個死循環,每隔一段時間就會循環一次,並將全局變量數組的每一個值都加1后判斷是否超過預定義的上限值,若發現某個線程對應的變量數值超過最大值,則看門狗線程會重置該線程。
然后,每個工作線程中,每隔一段時間就會將對應的全局變量置0 (喂狗)。
軟件看門狗的優點是無需額外的硬件支持,但當系統存在嚴重的錯誤時(例如:中斷服務出錯),則有可能導致軟件看門狗失效。