看門狗安裝包有問題?看門狗原理:在看門狗使能以後,需要在一定時間内對它進行喂狗,(一般在2S以内)如果沒有及時喂狗,則系統會被複位,系統重新從main()處開始運行,今天小編就來說說關于看門狗安裝包有問題?下面更多詳細答案一起來看看吧!
看門狗原理:在看門狗使能以後,需要在一定時間内對它進行喂狗,(一般在2S以内)如果沒有及時喂狗,則系統會被複位,系統重新從main()處開始運行。
程序跑飛:當系統受到外部幹擾導緻總線錯誤或者數組溢出等錯誤時,會使CPU core的PC寄存器指向一個不可預知的位置。這裡有兩層意思:一是程序一直跑向一個不可預知的地方;二是:程序死在一個循環中。
在抗幹擾實驗中,我們經常會看到這樣的現象,整個系統死機了,但是系統并不複位,即看門狗沒有複位系統。為什麼會出現這樣的現象呢?可能原因之一就是程序死在了一個死循環中,并且在此死循環中執行了喂狗操作,從而導緻系統無法複位。所以喂狗操作不能在可能出現死循環中執行,也不能在中斷程序中執行。
現在的CPU體系結構都是基于中斷的,如複位中斷發生時,PC會指向RESET向量處;如定時器中斷發生時,PC會指向定時中斷向量處。在彙編代碼中,RESET中斷地址和定時器中斷地址存放的會是JMP指令,跳向各自的中斷向量函數。所以,main()和各個中斷函數是平等的,從宏觀上講,main()函數和各中斷函數是并行執行的,隻是因為一上電就執行RESET指令,所以main()先運行,而其它的中斷函數運行的條件并不是總是滿足的,即使中斷函數被觸發執行,也并會像main()一樣,會執行while(true){},所以我們經常看到的是大部分系統任務都在main()中運行,而其它中斷任務處于一個從屬的位置。理解了這樣的前提條件,若喂狗操作在一個1S為周期的定時中斷中執行,即使系統跑飛(我們所說的跑飛大部分是指main()中的任務沒有執行),但定時中斷發生時,PC自動裝載定時中斷地址的指令,執行定時中斷函數,執行喂狗操作。定時中斷執行完畢後,執行退棧操作,PC又指向了不可預知的位置,主程序仍沒有執行(如果要main()重新開始執行,必須發生RESET),當定時中斷再次發生時,又會在中斷中執行喂狗,如此循環,從而導緻系統不會複位。而實質上程序已經跑飛。
在程序中,我們經常會看到這樣的代碼:
While(flag){
if 某硬件條件{
flag = 0;
}
}
如果硬件損壞或在幹擾下硬件暫時失效,則flag不會被置0,則程序就會死在此循環中,此時就會導緻整個系統複位。若在這段代碼中有喂狗操作,即使主程序跑飛,系統也不會複位。如何解決此累問題:一,在檢測硬件條件一定次數之後,如果條件還不成立,則将flag = 0;二,置定時器标志,在檢測硬件一定時間之後,不管條件是否成立,仍将flag = 0。
那麼喂狗操作應該在什麼地方執行更合理,更能保證程序的健狀性?
void main(){
InitSys();
while(true){
TASK1();
TASK2();
...
FeedWatchDog(); //執行喂狗操作
}
}
整個系統中,此有隻一處有喂狗操作,即如果主任務沒有被執行,則系統一定會複位。
如果TASK1,TASK2。。。。。。TASKn,運行時間加起來大于看門狗複位時間,可以在兩個任務之間插入喂狗操作。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!