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