1. 程式人生 > >在多工(RTOS)環境中使用看門狗

在多工(RTOS)環境中使用看門狗

        最近在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。

        使用者只需要提供和註冊兩個功能:第一個執行看門狗的硬體依賴的饋送,而另一個則在看門狗計數器達到零時指定進一步的動作。例如,這可以將日誌檔案儲存到非易失性儲存器中,在執行硬體復位或執行任何其他操作之前,包含有關係統狀態的進一步資訊。

結論

        當開始設計和開發具有看門狗的應用程式時,需要確保儘早決定如何使用它 。並考慮可以幫助您更快地實現的可用工具。至少,你不想被困在太空中,是嗎?

歡迎關注: