在多任務(wù)(RTOS)環(huán)境中使用看門狗的重要性
素材來源:Segger
編輯整理:strongerHuang
1994年1月25日,克萊門汀號發(fā)射升空,它是美國國家航空航天局(NASA)的衛(wèi)星,用于在長時間暴露于太空環(huán)境下測試傳感器和航天器組件。由于缺乏幾條看門狗代碼,它的任務(wù)于1994年5月7日丟失。
克萊門汀離開月球軌道并前往下一個目標(biāo)近地小行星Geographos時,已經(jīng)連續(xù)進(jìn)行了兩個月的月球制圖。然而不久,克萊門廷的一臺機(jī)載計算機(jī)出現(xiàn)故障,有效地阻止了NASA操作該航天器,并導(dǎo)致其推進(jìn)器之一不受控制地“開火”。
NASA花了20分鐘的時間試圖使該系統(tǒng)恢復(fù)活力,但無濟(jì)于事。硬件重置命令最終使克萊門汀重新上線,但為時已晚,它已經(jīng)用盡了所有燃料,因此必須取消任務(wù)的繼續(xù)。
隨后,負(fù)責(zé)克萊門汀軟件的開發(fā)團(tuán)隊希望他們使用了硬件的看門狗定時器,因為事實證明,他們實施的軟件超時不足。
一、看門狗如何提供幫助?
看門狗是一種硬件,可以直接集成到微控制器(MCU)中,或者從外部連接到微控制器。它的主要目的是在可以安全地假定系統(tǒng)已掛起或執(zhí)行不正確時執(zhí)行錯誤處理(通常是硬件重置)。
看門狗的主要組件是一個計數(shù)器,該計數(shù)器最初配置為某個值,然后遞減為零。軟件必須經(jīng)常將此計數(shù)器重置為其初始值,以確保其永遠(yuǎn)不會達(dá)到零。否則,可能會導(dǎo)致故障,并且通常會復(fù)位CPU。這表明看門狗是萬不得已的選擇,只有在其他所有方法都失敗后才可以選擇,就像克萊門汀那樣。
二、如何喂看門狗
正確使用看門狗定時器并不像重新啟動計數(shù)器那樣簡單(此過程通常稱為“喂”或“踢”看門狗)。在系統(tǒng)中運行看門狗定時器的情況下,開發(fā)人員必須仔細(xì)選擇看門狗的超時時間,以便看門狗可以在故障系統(tǒng)執(zhí)行任何不可逆的惡意操作之前進(jìn)行干預(yù)。
在簡單的應(yīng)用程序中,特別是在不使用RTOS的情況下,開發(fā)人員通常會從主循環(huán)中提供看門狗。這種方法只需要配置適當(dāng)?shù)某跏加嫈?shù)器值即可,就像選擇一個超出整個主循環(huán)的最壞情況執(zhí)行時間至少一個計時器周期的任何值一樣簡單。這通常是一種相當(dāng)健壯的方法:雖然某些系統(tǒng)需要立即恢復(fù),但其他系統(tǒng)僅需要確保它們不會無限期掛起-這肯定會完成工作。
三、在多任務(wù)(RTOS)環(huán)境中
在更復(fù)雜的系統(tǒng)中,尤其是在多任務(wù)系統(tǒng)中,由于各種原因可能會使線程掛起。有些線程可以長時間不運行,例如等待接收數(shù)據(jù)的通信線程。定期提供看門狗的干凈方法,同時仍要確保每個不同的過程都處于良好狀態(tài),這已成為這些系統(tǒng)開發(fā)人員的主要挑戰(zhàn),例如,他們需要關(guān)注以下方面:
-
操作系統(tǒng)是否正常執(zhí)行。 -
高優(yōu)先級任務(wù)是否耗盡了CPU,從而完全阻止了低優(yōu)先級任務(wù)的運行。 -
是否發(fā)生了阻礙執(zhí)行一項或多項任務(wù)的死鎖。 -
任務(wù)例程是否正確且完整地執(zhí)行。 -
開發(fā)人員還需要確保對源代碼進(jìn)行的任何修改(無論是專用的看門狗任務(wù)還是對受監(jiān)視任務(wù)的特定修改)都必須小且針對效率進(jìn)行優(yōu)化,以將干擾最小化。
四、利用RTOS的看門狗支持
有些RTOS操作系統(tǒng)(如SEGGER的embOS)自帶有看門狗解決方案,從而簡化了看門狗的處理,從而減少了在任何開發(fā)過程中花費的時間。
在RTOS中實現(xiàn)硬件看門狗的方法有很多種,我記得之前給大家分享過。其實,懂一些基本原理,自己都能設(shè)計。比如:每個任務(wù)添加“有關(guān)看門狗的計數(shù)”,超過設(shè)定時間做一定處理,否則看門狗復(fù)位。
當(dāng)然,一些操作系統(tǒng)自帶的看門狗功能,只需要調(diào)用API函數(shù)即可。比如embOS:任務(wù)可以簡單地在embOS看門狗模塊中注冊自己,并且可以同時分別配置其超時時間。然后,該任務(wù)可以通過調(diào)用一個簡單的embOS API函數(shù)來發(fā)信號通知其正確執(zhí)行。是否所有受監(jiān)視的任務(wù)都已在其指定的超時時間內(nèi)發(fā)出信號以指示其已正確執(zhí)行,隨后將通過另一個單個embOS API調(diào)用進(jìn)行檢查,該調(diào)用可以從專用的看門狗任務(wù)中,從OS_Idle()內(nèi)部,甚至從定期OS內(nèi)部執(zhí)行定時器中斷服務(wù)程序或任何其他ISR。
用戶只需要提供和注冊兩個功能:第一個執(zhí)行看門狗的硬件相關(guān)饋送,而第二個指定在看門狗計數(shù)器達(dá)到零的情況下采取的進(jìn)一步操作。例如,這允許將日志文件存儲到Flash,其中包含有關(guān)系統(tǒng)狀態(tài)的更多信息,然后再執(zhí)行硬件重置或采取任何其他措施。
五、最后
在開始使用看門狗設(shè)計和開發(fā)應(yīng)用程序時,盡早決定打算如何使用看門狗,并考慮可用的工具來幫助你更快地實現(xiàn)它。至少,你不想被困在“太空”中,對吧?
長按前往圖中包含的公眾號關(guān)注
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!