一、定義
看門狗,又叫watchdog timer,是一個定時器電路,一般有一個輸入,叫喂狗(kicking the dog/service the dog),一個輸出到MCU的RST端,MCU正常工作的時候,每隔一段時間輸出一個信號到喂狗端,給 WDT清零,如果超過規定的時間不喂狗(一般在程序跑飛時),WDT定時超過,就會給出一個復位信號到MCU,使MCU復位。防止MCU死機. 看門狗的作用就是防止程序發生死循環,或者說程序跑飛。
二、基本原理:
看門狗是一種監控系統的運行狀況的手段,通過軟硬件結合的方式實現對系統運行狀況的監控。穩定運行的軟件會在執行完特定指令后進行喂狗,若在一定周期內看門狗沒有收到來自軟件的喂狗信號,則認為系統故障,會進入中斷處理程序或強制系統復位。系統上電后根據不同的工作模式可以選擇使能看門狗的時機,若看門狗被使能則計數器開始計數,如果在設定的時間內沒有及時喂狗則會發生看門狗超時。看門狗主要由寄存器、計數器和狗叫模塊構成:通過寄存器對看門狗進行基本設置,計數器計算狗叫時間,狗叫模塊決定看門狗超時后發出的中斷或復位方式。
三、分類:
3.1硬件看門狗:
硬件看門狗是利用了一個定時器,來監控主程序的運行,也就是說在主程序的運行過程中,我們要在定時時間到之前對定時器進行復位。如果出現死循環,或者說PC指針不能回來,那么定時時間到后就會使單片機復位。常用的WDT芯片如MAX813,5045,IMP 813等。
3.2軟件看門狗:
而在某些情況下,也會采用純軟件的方法來設置看門狗,如在單片機系統中,利用閑置的定時器/計數器就可以設計一個軟件看門狗。具體實現步驟如下:
首先,在初始化程序中設置定時器/計數器的方式以控制寄存器(TMOD) 和定時時間的初值,並且打開中斷。然后,根據定時器的時間,在主程序中按一定的時間間隔插人復位定時器的指令(喂狗), 兩條喂狗指令之間的時間間隔可以根據系統時鍾與指令周期計算出來,而且該時間周期應該小於定時器的定時時間。最后,在定時器的中斷服務程序中,設置一條無條件轉移指令,將程序計數器PC轉移到初始化程序的入口。
在非單片機系統,如PowerPC系統中,也可以采用多線程的方式來設置軟件狗,其主要的步驟如下所述:
首先,新建一個看門狗線程,該線程維護一個全局變量數組,該數組相當於每個工作線程的計數器。看門狗線程為一一個死循環,每隔一段時間就會循環一次,並將全局變量數組的每一個值都加1后判斷是否超過預定義的上限值,若發現某個線程對應的變量數值超過最大值,則看門狗線程會重置該線程。
然后,每個工作線程中,每隔一段時間就會將對應的全局變量置0 (喂狗)。軟件看門狗的優點是無需額外的硬件支持,但當系統存在嚴重的錯誤時(例如:中斷服務出錯),則有可能導致軟件看門狗失效。
四、屏蔽方法:
看門狗的存在雖然使得程序變得更加健壯,但在某些時候它的存在會使的我們很困擾,例如在想要逆向分析調試ECU上的程序時,看門狗的存在成了我們不得不面對的一道難題,為了使得ECU能夠調試起來就必須屏蔽掉看門狗。
由看門狗的原理可知,看門狗最終的輸出信號時作用到MCU的RST引腳的,所屏蔽的核心就是如如何斷開外部信號和MCU的RST引腳的聯系。此處以汽車ECU的看們狗電路為例。
4.1、找基礎芯片:
汽車ECU中硬件看門狗,通常集成在電源管理芯片,通信轉換芯片等此類基礎芯片中。(如TLE9263BQX、NVC8518B、UJA113X)該類芯片中均存在一個引腳控制着看門狗,需要做的就時按照該芯片的數據手冊描述對該引腳進行拉高或拉低即可屏蔽看門狗電路)。
4.2、找外圍復位電路:
對於一些ECU中看門狗不存在基礎芯片中,而是由晶振、電阻、電容等電子元器件組成,對於此類看門狗的屏蔽方法就只能通過分析電路走線了,將於MCU中RST引腳相接的電阻或電容斷開,該電阻、電容大概率出現在有晶振存在的區域,該類的看門狗屏蔽比較復雜,基本上時通過排除法來嘗試的。
4.3、提供外圍干擾信號
對於那些即找不到基礎芯片、有找不到外圍看門狗電路的ECU,可以嘗試通過外部給MCU的RST引腳一個拉高(RST通過一個小阻值的電阻接到電源上)或拉低(RST通過一個小阻值的電阻接到地上)的信號。該方法存在些許風險,請謹慎嘗試。