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