最近在SEGGER的博客上看到一篇有關在實時操作系統使用看門狗的文章。從一個失敗的太空項目出發,分析了看門狗的作用及使用,自我感覺很有啟發,特此翻譯此文並推薦給各位同仁。為了閱讀方便,有些航天領域名詞本人添加了注釋,讀者也可自行搜索更詳細的解釋。當然限於個人水平,有不當之處懇請指正。大家也可以看原文:https://blog.segger.com/using-a-watchdog-in-a-multi-task-rtos-environment/。作者為Til Stork,其全文如下:
Clementine是美國航空航天局在1994年1月25日發射的空間環境下測試傳感器和航天器部件的衛星。由於缺乏幾條看門狗程序,她的任務於1994年5月7日失效。
【注】Clementine是美國的一個航天器,官方稱為深度空間計划科學實驗,由NASA和導彈防御組織聯合發射。
Clementine在連續兩個月進行了月球測繪后,離開月球軌道並連續前往她的下一個目標——近地球小行星Geographos。然而,Clementine所載電腦很快發生了故障,並切斷了NASA對航天器的有效操作,並導致其中一個推進器不受控制。
【注】Geographos:1620號小行星顆阿波羅型小行星離地球近時400余萬公里,其形狀為極規則長條形,長寬比為4至5倍。
NASA花了20分鍾試圖使系統得到恢復,但是無濟於事。硬件復位命令終於使Clementine重新上線,但為時已晚。她已經耗盡了所有的燃料,而任務的延續必須被取消。
在他們實施的軟件超時明顯失效時。負責Clementine軟件的開發團隊希望他們使用了硬件的看門狗定時器。
看門狗有什么作用?
看門狗是一種直接集成到微控制器中或者外部連接到微控制器的硬件。其主要目的是在可以安全地假設系統已掛起或以其他方式執行不正確的情況下執行錯誤處理(通常為硬件復位)。
看門狗的主要組件是一個計數器,最初被配置為一個特定的值,然后倒數為零。軟件必須經常將該計數器重新設置為其初始值,以確保其不會達到零。否則,會出現故障,通常會重置CPU。這表明看門狗是最后的手段,只有當其他一切都失敗時才采取這種選擇。就像Clementine的情況一樣。
如何喂狗
然而,正確使用看門狗定時器並不像重新啟動計數器那樣簡單(通常被稱為喂狗或者踢狗)的過程。在其系統中運行看門狗定時器時,開發人員必須仔細選擇看門狗的超時時間,以便看門狗在發生故障的系統可以執行任何不可逆轉的惡意動作之前進行干預。
在簡單的應用中,特別是沒有使用RTOS,開發人員通常會從主循環中提供看門狗。該方法僅需要配置適當的初始計數器值,它可以簡單地選擇任何超過整個主循環最壞的執行時間的值,至少有一個計時器周期。這通常是一個非常有效的方法,雖然有一些系統需要立即恢復,但更多系統只需要確保它們不會被無限期地掛起,這一方法能很好的實現之一目的。
在多任務(RTOS)環境中喂狗
然而,在更復雜的系統中,特別是多任務系統,各種線程可能會因為各種原因潛在地掛起。一些線程可以長時間運行,例如線程等待潛在的網絡通信。一個干凈的方法可以定期喂養看門狗,同時確保每個不同的過程都處於健康狀態,成為這些系統開發人員面臨的主要挑戰,例如需要關注的是:
- 操作系統是否正常執行
- 高優先級任務是否耗盡CPU,完全阻止低優先級任務運行
- 是否發生了阻止執行一個或多個任務的死鎖
- 任務程序是否正確執行
開發人員還需要確保對其源代碼執行的任何修改(無論是專用監視任務還是受監視任務的特定修改)都必須很小,並針對效率進行優化,以將侵擾性保持在最低限度。
RTOS增加看門狗支持
因此,最先進的RTOS如SEGGER的embOS為客戶提供綜合的看門狗解決方案,以簡化看門狗處理,從而減少任何開發過程的時間花費。
這些解決方案應用的一般原則可能會因不同的RTOS而異。然而,在SEGGER,多功能性和易用性被認為是首要的,同時在內存使用和執行時間內將所需的占用空間最小化。因此,對於嵌入式專家來說,顯然需要一套全面的API函數來實現:
- 單獨注冊任務,計時器,甚至帶embOS看門狗模塊的ISR。
- 從任何所需的上下文靈活地測試預期看門狗狀態的可能性。
現在最終的實現只包括五個API函數,但功能足以滿足任何預期的目的。
使用這些API函數,一個任務可以簡單地將其自身注冊到embOS看門狗模塊,並可以單獨配置其超時時間。然后,任務可以通過調用一個簡單的embOS API函數來定期發出正確的執行。所有被監視的任務是否在指定的超時時間內發出正確的執行信號,隨后通過另一個單獨的embOS API調用進行檢查,該調用可以在專用看門狗任務內從OS_Idle()內執行,甚至從定期操作系統定時器中斷服務程序或任何其他ISR。
用戶只需要提供和注冊兩個功能:第一個執行看門狗的硬件依賴的饋送,而另一個則在看門狗計數器達到零時指定進一步的動作。例如,這可以將日志文件存儲到非易失性存儲器中,在執行硬件復位或執行任何其他操作之前,包含有關系統狀態的進一步信息。
結論
當開始設計和開發具有看門狗的應用程序時,需要確保盡早決定如何使用它 。並考慮可以幫助您更快地實現的可用工具。至少,你不想被困在太空中,是嗎?