多任務(wù)系統(tǒng)看門狗的實(shí)現(xiàn)
如果程序出現(xiàn)故障,不在定時(shí)周期內(nèi)復(fù)位看門狗,就使得看門狗定時(shí)器溢出產(chǎn)生復(fù)位信號(hào)并重啟系統(tǒng)。軟件看門狗原理上一樣,只是將硬件電路上的定時(shí)器用處理器的內(nèi)部定時(shí)器代替,這樣可以簡(jiǎn)化硬件電路設(shè)計(jì),但在可靠性方面不如硬件定時(shí)器,比如系統(tǒng)內(nèi)部定時(shí)器自身發(fā)生故障就無(wú)法檢測(cè)到。當(dāng)然也有通過(guò)雙定時(shí)器相互監(jiān)視,這不僅加大系統(tǒng)開(kāi)銷,也不能解決全部問(wèn)題,比如中斷系統(tǒng)故障導(dǎo)致定時(shí)器中斷失效。
看門狗本身不是用來(lái)解決系統(tǒng)出現(xiàn)的問(wèn)題,在調(diào)試過(guò)程中發(fā)現(xiàn)的故障應(yīng)該要查改設(shè)計(jì)本身的錯(cuò)誤。加入看門狗目的是對(duì)一些程序潛在錯(cuò)誤和惡劣環(huán)境干擾等因素導(dǎo)致系統(tǒng)死機(jī)而在無(wú)人干預(yù)情況下自動(dòng)恢復(fù)系統(tǒng)正常工作狀態(tài)??撮T狗也不能完全避免故障造成的損失,畢竟從發(fā)現(xiàn)故障到系統(tǒng)復(fù)位恢復(fù)正常這段時(shí)間內(nèi)怠工。同時(shí)一些系統(tǒng)也需要復(fù)位前保護(hù)現(xiàn)場(chǎng)數(shù)據(jù),重啟后恢復(fù)現(xiàn)場(chǎng)數(shù)據(jù),這可能也需要一筆軟硬件的開(kāi)銷。
圖1:(a) 多任務(wù)系統(tǒng)看門狗示意圖
;(b) 相應(yīng)的看門狗復(fù)位邏輯圖。
在單任務(wù)系統(tǒng)中看門狗工作原理如上所述,容易實(shí)現(xiàn)。在多任務(wù)系統(tǒng)中情況稍為復(fù)雜。假如每個(gè)任務(wù)都像單任務(wù)系統(tǒng)那么做,如圖1(a)所示,只要有一個(gè)任務(wù)正常工作并定期“喂狗”,看門狗定時(shí)器就不會(huì)溢出。除非所有的任務(wù)都故障,才能使得看門狗定時(shí)器溢出而復(fù)位,如圖1(b)。
而往往我們需要的是只要有一個(gè)任務(wù)故障,系統(tǒng)就要求復(fù)位?;蛘哌x擇幾個(gè)關(guān)鍵的任務(wù)接受監(jiān)視,只要一個(gè)任務(wù)出問(wèn)題系統(tǒng)就要求復(fù)位,如圖2(a)所示,相應(yīng)的看門狗復(fù)位邏輯如圖2(b)所示。
在多任務(wù)系統(tǒng)中通過(guò)創(chuàng)建一個(gè)監(jiān)視任務(wù)TaskMonitor,它的優(yōu)先級(jí)高于被監(jiān)視的任務(wù)群Task1、Task2...Taskn。TaskMonitor在Task1~Taskn正常工作情況下,一定時(shí)間內(nèi)對(duì)硬件看門狗定時(shí)器清零。如果被監(jiān)視任務(wù)群有一個(gè)Task_x出現(xiàn)故障,TaskMonitor就不對(duì)看門狗定時(shí)器清零,也就達(dá)到被監(jiān)視任務(wù)出現(xiàn)故障時(shí)系統(tǒng)自動(dòng)重啟的目的。另外任務(wù)TaskMonitor自身出故障時(shí),也不能及時(shí)對(duì)看門狗定時(shí)器清零,看門狗也能自動(dòng)復(fù)位重啟。接下來(lái)需要解決一個(gè)問(wèn)題是:監(jiān)視任務(wù)如何有效監(jiān)視被監(jiān)視的任務(wù)群。
圖2:(a) 多任務(wù)系統(tǒng)看門狗示意圖;(b) 正確的看門狗復(fù)位邏輯圖。
在TaskMonitor中定義一組結(jié)構(gòu)體來(lái)模擬看門狗定時(shí)器組,
typedef STruct
{
UINT32 CurCnt, LastCnt;
BOOL RunState;
int taskID;
} STRUCT_WATCH_DOG;
評(píng)論