RTOS下看門狗的使用策略

什么是看門狗

看門狗定時(shí)器是一種電子定時(shí)器润匙,用于檢測嵌入式系統(tǒng)中的錯(cuò)誤并從中恢復(fù)就珠。 看門狗定時(shí)器的基本原理很簡單但很有效蛉威。 在特定時(shí)間段內(nèi)仿荆,系統(tǒng)必須通知(喂狗)看門狗它仍在運(yùn)行。 如果看門狗未收到此通知鲤桥,則它假定存在故障并將系統(tǒng)置于已知狀態(tài)揍拆。 通常,看門狗將重置(復(fù)位)處理器茶凳。 但是嫂拴,對于更復(fù)雜的系統(tǒng),看門狗可能必須觸發(fā)一系列操作才能將系統(tǒng)置于已知的安全狀態(tài)慧妄,例如電梯顷牌,檢測到系統(tǒng)故障就不能簡單的復(fù)位,不然后果很嚴(yán)重塞淹,而是在看門狗中斷觸發(fā)后讓系統(tǒng)處于一個(gè)安全的狀態(tài),比如停止運(yùn)動罪裹,并打開安全保護(hù)裝置饱普。

基本的看門狗保護(hù)

平時(shí)常用的一種方式是創(chuàng)建一個(gè)任務(wù)运挫,在任務(wù)里周期性的喂狗。這種方式在這個(gè)喂狗任務(wù)故障或者系統(tǒng)完全崩潰(如hardfault)導(dǎo)致喂狗任務(wù)無法正常執(zhí)行時(shí)套耕,可以發(fā)揮作用谁帕。
現(xiàn)在我們處于RTOS下,情況就有點(diǎn)復(fù)雜了冯袍,某個(gè)或多個(gè)任務(wù)失效了匈挖,并不會導(dǎo)致整個(gè)系統(tǒng)崩潰。這些情況可能是:

  • 某個(gè)任務(wù)里進(jìn)入了死循環(huán)康愤,但是仍能正常調(diào)度其它任務(wù)儡循;
  • 兩個(gè)或多個(gè)任務(wù)因資源問題進(jìn)入了死鎖的狀態(tài);
  • 某個(gè)低優(yōu)先級任務(wù)因?yàn)楦邇?yōu)先級任務(wù)一直搶占了CPU而得不到運(yùn)行征冷;

可見择膝,這種方式在RTOS環(huán)境下能發(fā)揮的效果有限!<旒ぁ肴捉!

提高魯棒性

前面提到的失效原因,都是因?yàn)榭撮T狗沒能檢測到每一個(gè)任務(wù)的運(yùn)行狀態(tài)叔收。所以齿穗,優(yōu)化的辦法的就是讓它能檢測到每個(gè)任務(wù)的運(yùn)行。一個(gè)方法就是其它任務(wù)周期性的給喂狗任務(wù)發(fā)送通知饺律,喂狗任務(wù)如果收到所有任務(wù)的通知就進(jìn)行一次喂狗窃页。這樣,如果某個(gè)任務(wù)故障了蓝晒,那將無法正常的發(fā)送喂狗通知腮出,喂狗條件無法得到滿足,因此一段時(shí)間后看門狗定時(shí)器將會超時(shí)芝薇。
下面是FreeRTOS下的簡單實(shí)現(xiàn)方式:

#define TASK_1_BIT  (1UL << 0UL)
#define TASK_2_BIT  (1UL << 1UL)

/* 看門狗任務(wù)設(shè)為最高優(yōu)先級胚嘲,這樣在收到低優(yōu)先級的任務(wù)發(fā)來喂狗通知后能及時(shí)喂狗 */
void task_watchdog(void * pvParameters)
{
    uint32_t ulNotifiedValue;

    while (1)
    {
        /* 等待喂狗通知 */
        xTaskNotifyWait( 0x00, 0x00, &ulNotifiedValue, portMAX_DELAY );

        /* 判斷是否收到了所有其他任務(wù)的通知 */
        if( (ulNotifiedValue & (TASK_1_BIT | TASK_2_BIT)) == (TASK_1_BIT | TASK_2_BIT) )
        {
            /* 收到則喂狗 */
            feed_dog();
            /* 清除通知,等待一下次喂狗 */
            ulTaskNotifyValueClear(NULL, UINT_MAX);
        }
    }
}

void task_1(void * pvParameters)
{
    while (1)
    {
        /* 通知喂狗 */
        xTaskNotify( xTaskWatchdogHandle, TASK_1_BIT, eSetBits );

        /* 努力干活 */

        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void task_2(void * pvParameters)
{
    uint32_t ulNotifiedValue;
    BaseType_t result;

    while (1)
    {
        /* 類似這種等待不能永久等待洛二,而是有個(gè)超時(shí)時(shí)間馋劈,后面根據(jù)判斷是否收到消息再做處理 */
        /* 官方文檔有句話是這么說的:NOTE!  Real applications should not block indefinitely,
        but instead time out occasionally in order to handle error conditions
        that may prevent the interrupt from sending any more notifications. */
        result = xTaskNotifyWait( 0x00, ULONG_MAX, &ulNotifiedValue, 2000 / portTICK_PERIOD_MS );

        if (pdTRUE == result)
        {
            /* 努力干活 */
        }

        /* 通知喂狗 */
        xTaskNotify( xTaskWatchdogHandle, TASK_2_BIT, eSetBits );
    }
}

更高級的使用策略


本人沒看懂,下面是一個(gè)現(xiàn)成的解決方案晾嘶,有條件的可以研究
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妓雾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垒迂,更是在濱河造成了極大的恐慌械姻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件机断,死亡現(xiàn)場離奇詭異楷拳,居然都是意外死亡绣夺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門欢揖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陶耍,“玉大人,你說我怎么就攤上這事她混×页” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵坤按,是天一觀的道長毯欣。 經(jīng)常有香客問我,道長晋涣,這世上最難降的妖魔是什么仪媒? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮谢鹊,結(jié)果婚禮上算吩,老公的妹妹穿的比我還像新娘。我一直安慰自己佃扼,他們只是感情好偎巢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兼耀,像睡著了一般压昼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘤运,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天窍霞,我揣著相機(jī)與錄音,去河邊找鬼拯坟。 笑死但金,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郁季。 我是一名探鬼主播冷溃,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梦裂!你這毒婦竟也來了似枕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤年柠,失蹤者是張志新(化名)和其女友劉穎凿歼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毅往,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年牵咙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了派近。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攀唯。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渴丸,靈堂內(nèi)的尸體忽然破棺而出侯嘀,到底是詐尸還是另有隱情,我是刑警寧澤谱轨,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布戒幔,位于F島的核電站,受9級特大地震影響土童,放射性物質(zhì)發(fā)生泄漏诗茎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一献汗、第九天 我趴在偏房一處隱蔽的房頂上張望敢订。 院中可真熱鬧,春花似錦罢吃、人聲如沸楚午。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾柜。三九已至,卻和暖如春就谜,著一層夾襖步出監(jiān)牢的瞬間怪蔑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工丧荐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缆瓣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓篮奄,卻偏偏與公主長得像捆愁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子窟却,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348