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