對于那些人類無法持續(xù)監(jiān)視的嵌入式系統(tǒng),看門狗芯片可能是個很好的解決方案。英銳恩單片機開發(fā)工程師表示,大多數(shù)嵌入式系統(tǒng)需要自主處理異常,如果運算跑偏了,通常不可能等人們重新引導他們。這種情況下需要一個復位芯片,以引導嵌入式系統(tǒng)的重啟。
看門狗芯片是一種硬件,可以用來自動檢測軟件異常,并在發(fā)生任何異常時重置處理器。一般來說,看門狗芯片基于一個從某個初始值遞減到零的計數(shù)器。嵌入式軟件選擇計數(shù)器的初始值并定期重新啟動它。如果計數(shù)器在軟件重新啟動之前達到零,則認為軟件發(fā)生故障,并且處理器的復位信號有效。處理器(及其運行的嵌入式軟件)將重新啟動,就像人工操作員已關閉電源再打開一樣。
如下圖所示,看門狗芯片是處理器外部的芯片。但是,它也可以與CPU包含在同一芯片中。這是在許多單片機中完成的。無論哪種情況,看門狗芯片的輸出都直接與處理器的復位信號相關。
一、什么是踢狗(也叫:喂狗)
重新啟動看門狗芯片計數(shù)器的過程有時稱為“踢狗(喂狗)”。踢狗的作用作用主要是起到復位重啟的作用,確保機器能夠一直運行。
如下面的案例1中,做了一個簡單的示例。這里,我們有一個無限循環(huán)來控制系統(tǒng)的整個行為。這種軟件體系結構在許多具有低端處理器和基于單個工作頻率的行為的嵌入式系統(tǒng)中很常見。該看門狗的硬件實現(xiàn)允許通過內(nèi)存映射寄存器設置計數(shù)器值。
uint16 volatile * pWatchdog =
(uint16 volatile *) 0xFF0000;
main(void)
{
hwinit();
for (;;)
{
*pWatchdog = 10000;
read_sensors();
control_motor();
display_status();
}
}
案例1:踢狗
假設循環(huán)必須每五毫秒至少執(zhí)行一次。(假設必須至少經(jīng)常向電動機提供新的控制參數(shù)。)如果看門狗芯片的計數(shù)器初始化為與經(jīng)過的時間(即10000毫秒)對應的五毫秒的值,并且軟件沒有錯誤,看門狗芯片將永遠不會到期,軟件將始終在達到零之前重新啟動計數(shù)器。
二、軟件異常
看門狗芯片可以使系統(tǒng)擺脫許多危險情況。但是,如果要有效,必須在整個軟件設計中考慮復位看門狗芯片。設計人員必須知道其軟件可能出什么問題,并確??撮T狗芯片能夠檢測到它們(如果有的話)。
系統(tǒng)掛起有多種原因。導致執(zhí)行無限循環(huán)的邏輯謬誤是最簡單的。假設這種情況發(fā)生在案例1的read_sensors()調(diào)用中。其他任何軟件(ISR除外,如果仍然啟用中斷)都不會再次運行。
另一種可能性是,在循環(huán)的一次通過期間,異常數(shù)量的中斷到達。在ISR中花費的任何額外時間就是沒有花費在執(zhí)行主循環(huán)上的時間。可能會給電機新的控制指令帶來危險的延遲。
使用多任務內(nèi)核時,可能會發(fā)生死鎖。例如,一組任務可能會卡在彼此之間等待,并且其中一個需要一些外部信號,從而使整個任務組無限期地掛起。
如果此類故障是瞬態(tài)的,則每次看門狗引起的復位后,系統(tǒng)可能會在一段時間內(nèi)正常運行。但是,發(fā)生故障的硬件可能會導致系統(tǒng)不斷重置。因此,計算看門狗引起的復位次數(shù)并在固定次數(shù)的故障后放棄嘗試可能是明智的。
三、Karate框架接口測試
實際的看門狗實現(xiàn)通常會具有一個與案例1中的軟件相比更為復雜的軟件接口。當重置看門狗所需的指令集非常簡單時,有漏洞的軟件可能會偶然執(zhí)行此操作??紤]一個錯誤,該錯誤導致將值10000一次又一次地寫入內(nèi)存中的每個位置。此代碼將定期重新啟動看門狗計數(shù)器,并且看門狗可能永遠不會咬人。為防止這種情況,許多看門狗實現(xiàn)要求使用兩個或多個連續(xù)寫入的復雜序列來重新啟動看門狗芯片。
如果看門狗內(nèi)置在你的單片機中,則在設備復位時可能不會自動啟用它。你必須確保在硬件初始化期間啟用它。為了提供保護以防止意外禁用看門狗的錯誤,硬件設計通常使得一旦啟用看門狗芯片就無法禁用它。
如果你的軟件可以比看門狗周期更快地完成一個完整的循環(huán),那么案例1中的結構可能對你來說很好。如果你的軟件的某些部分需要很長時間才能完成,那么挑戰(zhàn)就更大了。假設你有一個循環(huán),等待元素加熱到一定溫度再返回。許多看門狗芯片的最長持續(xù)時間約為兩秒鐘。如果你要延遲的時間超過該時間長度,則可能必須在等待循環(huán)中踢狗。如果你的軟件中有很多這樣的地方,看門狗的控制可能會出現(xiàn)問題。
系統(tǒng)初始化是代碼的一部分,通常需要比看門狗芯片的最大時間更長的時間。也許進行內(nèi)存測試或從ROM到RAM的數(shù)據(jù)傳輸會減慢此速度。因此,某些看門狗可以比其后繼踢等待更長的時間來等待他們的第一個踢。
隨著將控制線程添加到軟件中(以ISR和軟件任務的形式),在代碼中僅放置一處看門狗變得無效。所以,選擇合適的踢腳間隔也是一個重要問題,這只能以系統(tǒng)特定的方式解決。
以上就是英銳恩單片機開發(fā)工程師分享的有關看門狗芯片的介紹與應用場景。英銳恩專注單片機應用方案設計與開發(fā),提供8位單片機、16位單片機、32位單片機、運算放大器和模擬開關。