0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Linux操作系統(tǒng)和IMP706芯片實現(xiàn)看門狗計數(shù)器清零電路的設(shè)計

電子設(shè)計 ? 來源:單片機與嵌入式系統(tǒng)應(yīng)用 ? 作者:張長順,黃建元, ? 2020-09-15 17:58 ? 次閱讀

來源:單片機嵌入式系統(tǒng)應(yīng)用作者:張長順,黃建元,趙新榮,陸永剛

引言

嵌入式系統(tǒng)中,為了使系統(tǒng)在異常情況下能自動恢復(fù),一般都會引入看門狗電路。看門狗電路其實就是一個計數(shù)器。當(dāng)看門狗啟動后,計數(shù)器開始自動計數(shù),經(jīng)過一定時間計數(shù)器溢出就會對CPU產(chǎn)生一個復(fù)位信號使系統(tǒng)重啟。系統(tǒng)正常運行時,需要在看門狗允許的時間間隔內(nèi)對看門狗計數(shù)器清零也即喂狗,不讓復(fù)位信號產(chǎn)生。

當(dāng)前在帶Linux操作系統(tǒng)的嵌入式系統(tǒng)中,由于Linux操作系統(tǒng)加載時間較長(如10~30 s),一般都超過看門狗的時間間隔(典型值為l.6 s);而如果不采取特殊措施,則系統(tǒng)在Linux操作系統(tǒng)加載過程中復(fù)位,Linux操作系統(tǒng)永遠(yuǎn)無法加載成功。為了解決這個問題,通常有兩種方案 [1-2]:做一個看門狗的時間間隔更長的硬件電路;修改內(nèi)核,在內(nèi)核啟動過程中將看門狗設(shè)成無效。以上方案無法解決嵌入式系統(tǒng)在操作系統(tǒng)啟動階段的失效問題,降低了系統(tǒng)可靠性。

本文提出了一種嵌入式系統(tǒng)全程喂狗策略及實現(xiàn)方法,從系統(tǒng)上電、引導(dǎo)程序(Bootloader)、操作系統(tǒng)內(nèi)核直至應(yīng)用階段都啟用看門狗。實驗表明,該方法簡單可行,成本較低,在嵌入式系統(tǒng)的全過程中都可以實現(xiàn)喂狗策略,提高了系統(tǒng)可靠性。

1 系統(tǒng)總體設(shè)計

采用IMP706芯片組成硬件看門狗電路(看門狗的時間間隔為1.6 s),在操作系統(tǒng)程序(包括Bootloader)和應(yīng)用程序中插人喂狗程序,這些喂狗程序運行時問間隔小于看門狗的時間間隔(本設(shè)計選為1 s)。這樣做可以保證:如果系統(tǒng)正常工作,系統(tǒng)可以在小于看門狗的時間間隔內(nèi)不斷進(jìn)行喂狗動作,硬件看門狗的計數(shù)器不斷清零,不產(chǎn)生復(fù)位信號;如果系統(tǒng)非正常工作,喂狗動作失效,硬件看門狗的計數(shù)器在1.6 s后溢出,對CPU產(chǎn)生復(fù)位信號使系統(tǒng)重啟。

1.1 看門狗電路設(shè)計

圖 1為看門狗電路原理,采用IMP706芯片組成硬件看門狗電路,通過電平轉(zhuǎn)換器件74AVC1T45,硬件看門狗器件的ST腳與中央處理器(CPU)的 GPIO3腳相連??撮T狗器件的PRST腳與IN腳接到復(fù)位開關(guān),RST腳接到CPU的RESET腳,當(dāng)復(fù)位開關(guān)被觸動或看門狗器件的計數(shù)器溢出時,看門狗器件的RST腳輸出復(fù)位信號給CPU的RESET腳,CPU復(fù)位重啟。

1.2 喂狗策略及實現(xiàn)

1.2.1 Bootloader階段

在 Bootloader階段(本設(shè)計采用U-boot,但不限于此),喂狗策略是在Bootloader的程序中不同位置插入喂狗程序。具體做法是:由于 Bootoader第一階段的啟動不會超過1.6 s,因此只需在Bootoader的第二階段,如Flash讀寫、CRC校驗、循環(huán)等待等處,插入喂狗代碼。喂狗代碼采用直接置位中央處理器的GPlO3 狀態(tài)寄存器的方式進(jìn)行。

首先在特定平臺的定義頭文件include/condffigs/xxx.h中加入看門狗的宏定義:

1.2.2 Linux內(nèi)核階段

在Linux內(nèi)核加載階段(采用 MontaVista Linux操作系統(tǒng),但不限于此),喂狗策略是在Linux內(nèi)核程序的不同位置插入喂狗程序。具體做法是:首先在Linux內(nèi)核階段1的內(nèi)核解壓縮程序、 RTC驅(qū)動加載程序、GPIO驅(qū)動加載程序適當(dāng)代碼處插入喂狗代碼,喂狗代碼以直接取反中央處理器的GPlO3狀態(tài)寄存器的方式進(jìn)行;在Linux內(nèi)核階段2的Watchdog驅(qū)動加載程序適當(dāng)代碼處插入喂狗代碼,喂狗代碼調(diào)用GPIO驅(qū)動,GPIO驅(qū)動內(nèi)含取反中央處理器的GPlO3狀態(tài)寄存器的操作;在Linux內(nèi)核階段3的內(nèi)核加載根文件系統(tǒng)程序、init程序的適當(dāng)代碼處調(diào)用Linux的Watchdog驅(qū)動,Watchdog驅(qū)動內(nèi)含取反中央處理器的GPlO3狀態(tài)寄存器的操作。

以上內(nèi)核階段的劃分是以GPIO及Watchdog驅(qū)動的加載為標(biāo)志的。GPIO驅(qū)動加載之前為內(nèi)核階段1,GPIO驅(qū)動加載之后至Watchdog驅(qū)動加載之前為內(nèi)核階段2,Watchdog驅(qū)動加載之后為內(nèi)核階段3。

下面示例說明內(nèi)核解壓縮asm/arch/boot/com—pressed.C中喂狗的實現(xiàn)代碼:

從以上代碼可以看出,它是內(nèi)核階段1喂狗的典型方法,是直接取反GPlO3狀態(tài)寄存器的。

下面示例說明內(nèi)核階段2的喂狗方法(僅以加載RTC驅(qū)動為例):首先讓RTC驅(qū)動中包含GPIO的頭文件,然后在讀取RTC當(dāng)前值的函數(shù)中調(diào)用GPIO驅(qū)動進(jìn)行喂狗。

為了能夠在內(nèi)核階段3調(diào)用Watchdog驅(qū)動進(jìn)行喂狗,需要在Watchdog驅(qū)動中導(dǎo)出喂狗函數(shù)以供內(nèi)核階段3使用。Watchdog驅(qū)動喂狗也是調(diào)用GPIO驅(qū)動實現(xiàn)的,但Watchdog驅(qū)動一旦加載完成,以后的喂狗都通過調(diào)用 Watchdog驅(qū)動完成。

1.2.3 程序運行階段

圖2為多線程應(yīng)用程序運行階段喂狗方法。在主程序中首先創(chuàng)建一個監(jiān)控線程,它的優(yōu)先級高于其他線程。監(jiān)控線程在其他被監(jiān)控的線程正常工作的情況下,一定時間內(nèi)對看門狗進(jìn)行喂狗操作,喂狗操作通過調(diào)用Watch—dog驅(qū)動來完成。如果某個線程出現(xiàn)故障,監(jiān)控線程就不執(zhí)行喂狗操作,也就達(dá)到這個線程出現(xiàn)故障時系統(tǒng)自動重啟的目的。如果監(jiān)控線程自身出現(xiàn)故障,不能及時執(zhí)行喂狗操作,看門狗也自動復(fù)位重啟。具體做法是,主程序首先啟動監(jiān)控線程,然后依次啟動N個被監(jiān)控的線程,每一線程內(nèi)都設(shè)置一計數(shù)器。被監(jiān)控的線程中首先對線程內(nèi)的計數(shù)器初始化為0,在各個線程主循環(huán)中,對相應(yīng)的計數(shù)器執(zhí)行加1操作。監(jiān)控任務(wù)首先啟動看門狗,進(jìn)入循環(huán)。每隔M秒對各線程內(nèi)的計數(shù)器進(jìn)行檢驗,在M秒內(nèi)每隔1 s要對看門狗喂狗,否則系統(tǒng)就會復(fù)位重啟。查詢N個計數(shù)器值是否為O,如果全都大于O,則說明對應(yīng)接受監(jiān)控的線程正常運行,然后對看門狗喂狗,并將N個計數(shù)

器值清零。如果有任意一個計數(shù)器值為0,檢測到對應(yīng)接受監(jiān)視的線程出現(xiàn)故障需要重啟,這時不對看門狗喂狗,使得系統(tǒng)復(fù)位重啟。

以下示例說明在應(yīng)用中如何調(diào)用Watchdog驅(qū)動實現(xiàn)喂狗:

總之,在系統(tǒng)不同階段,由于系統(tǒng)調(diào)用和封裝程度不同,看門狗的喂狗實現(xiàn)方法也不同:在Bootloader階段,直接取反中央處理器的GPIO3的狀態(tài)寄存器;在Linux內(nèi)核階段1,采取取反中央處理器的GPlO3的狀態(tài)寄存器的方法進(jìn)行;在Linux內(nèi)核階段2,采取調(diào)用GPIO的驅(qū)動的方法進(jìn)行;在Linux內(nèi)核階段3,采取調(diào)用Watchdog驅(qū)動的方法進(jìn)行;在應(yīng)用程序運行階段,應(yīng)用程序中的喂狗程序采取調(diào)用Watchdog驅(qū)動的方法進(jìn)行,如圖3所示。

2 實驗結(jié)果

我們在公司研發(fā)的智能視頻分析器項目中應(yīng)用了本方法。該分析器采用TI DaVinci系列DSP芯片(TMS320DM6446)為CPU,用Monta Vista Linux作為操作系統(tǒng)。操作系統(tǒng)啟動時間約為20~30 s。采用本方法是為了保證系統(tǒng)在全過程中都能得到有效的失效恢復(fù)。

在振蕩波抗擾度、電壓波動與閃爍、靜電放電、電快速瞬變脈沖群等EMC兼容性測試中,當(dāng)各強度指標(biāo)超過設(shè)備EMC兼容性設(shè)計強度時,系統(tǒng)失效,利用這種方式可以測試本方法在硬件失效時的效果。以靜電放電為例,設(shè)計放電等級為±6 kV(我們?nèi) ? kV的強度等級),設(shè)備上電后,分別在1~30 s內(nèi)每隔5 s及在120 s處進(jìn)行靜電放電測試,經(jīng)觀察設(shè)備都可以即時恢復(fù)。

對軟件失效時本方法效果的測試,采用故障植入腳本的主動方式及系統(tǒng)長時間運行的被動方式進(jìn)行測試。最終結(jié)果表明,設(shè)備在失效后可即時恢復(fù)。

綜上所述,本全程喂狗的方法能確保系統(tǒng)在任一階段出現(xiàn)軟件或硬件故障時都能復(fù)位重啟。

結(jié)語

本文提出了一種嵌入式系統(tǒng)全程喂狗策略,包括硬件電路設(shè)計和軟件實現(xiàn)方法。該方法有如下特點:看門狗電路簡單,硬件只需一塊看門狗芯片,不需復(fù)雜的外圍邏輯電路,成本較低;系統(tǒng)全過程啟用看門狗,確保系統(tǒng)在任一階段出現(xiàn)軟件或硬件故障都能復(fù)位重啟,系統(tǒng)可靠性得到提高。

責(zé)任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 芯片
    +關(guān)注

    關(guān)注

    452

    文章

    50005

    瀏覽量

    419698
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11177

    瀏覽量

    208489
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6617

    瀏覽量

    123034
收藏 人收藏

    評論

    相關(guān)推薦

    看門狗多任務(wù)系統(tǒng)及喂狗方法詳解

    看門狗分硬件看門狗和 軟件看門狗。硬件看門狗是利用一個定時電路,其定時輸出連接到
    的頭像 發(fā)表于 07-05 09:21 ?1.9w次閱讀
    <b class='flag-5'>看門狗</b>多任務(wù)<b class='flag-5'>系統(tǒng)</b>及喂狗方法詳解

    如何利用看門狗電路改善系統(tǒng)可靠性

    看門狗電路基本功能是在發(fā)生軟件問題和程序跑飛后使系統(tǒng)重新啟動。看門狗計數(shù)器正常工作時自動計數(shù),程
    發(fā)表于 02-26 07:30

    嵌入式系統(tǒng)看門狗計數(shù)器怎么清零?

    在嵌入式系統(tǒng)中,為了使系統(tǒng)在異常情況下能自動恢復(fù),一般都會引入看門狗電路。看門狗電路其實就是一個
    發(fā)表于 03-09 06:16

    基于遞減計數(shù)器和預(yù)分頻的獨立看門狗

    –是一個定時,供能–計數(shù)。每隔一段時間就喂狗–計數(shù)清零,重新計時,程序出錯不能喂狗,得復(fù)位。獨立看門狗獨立
    發(fā)表于 07-30 07:24

    WDT看門狗模塊的相關(guān)資料分享

    工作時自動計數(shù),程序流程定期將其復(fù)位清零,如果系統(tǒng)在某處卡死或跑飛,該定時將溢出,并將進(jìn)入中斷。在定時中斷中執(zhí)行一些復(fù)位
    發(fā)表于 11-04 06:16

    基于CPLD技術(shù)的看門狗電路的設(shè)計

    【摘 要】 介紹了一種基于CPLD器件設(shè)計看門狗電路的方法?! £P(guān)鍵詞:CPLD,看門狗,計數(shù)器 1 引 言  隨著現(xiàn)代電子技
    發(fā)表于 05-16 19:18 ?750次閱讀
    基于CPLD技術(shù)的<b class='flag-5'>看門狗</b><b class='flag-5'>電路</b>的設(shè)計

    利用看門狗提高系統(tǒng)可靠性

    看門狗是一個計數(shù)器,它需要在一定的看門狗延時周期內(nèi)被清零,如果沒有清零動作,看門狗
    發(fā)表于 03-07 16:03 ?35次下載
    利用<b class='flag-5'>看門狗</b>提高<b class='flag-5'>系統(tǒng)</b>可靠性

    看門狗定時的設(shè)計、工作原理及看門狗定時操作

    看門狗定時(WDT,Watch Dog Timer)是單片機的一個組成部分,它實際上是一個計數(shù)器,一般給看門狗一個數(shù)字,程序開始運行后看門狗
    發(fā)表于 05-23 09:14 ?7577次閱讀
    <b class='flag-5'>看門狗</b>定時<b class='flag-5'>器</b>的設(shè)計、工作原理及<b class='flag-5'>看門狗</b>定時<b class='flag-5'>器</b>的<b class='flag-5'>操作</b>

    看門狗喂狗時間及程序

    ,過一段時間CPU應(yīng)發(fā)出指令讓看門狗復(fù)位,重新開始倒計數(shù)。如果看門狗減到0就認(rèn)為程序沒有正常工作,強制整個系統(tǒng)復(fù)位。 看門狗分硬件
    發(fā)表于 10-16 09:19 ?1.7w次閱讀

    一文讀懂單片機看門狗電路

    看門狗定時是一個計數(shù)器,基本功能是在發(fā)生軟件問題和程序跑飛后使系統(tǒng)重新啟動。看門狗計數(shù)器正常工
    的頭像 發(fā)表于 10-31 17:29 ?3.7w次閱讀
    一文讀懂單片機<b class='flag-5'>看門狗</b><b class='flag-5'>電路</b>

    STM32看門狗配置(獨立看門狗IWDG和窗口看門狗WWDG)

    stm32自帶兩個看門狗模塊,獨立看門狗IWDG和窗口看門狗WWDG。看門狗主要作用是可用來檢測和解決由軟件錯誤引起的故障;當(dāng)計數(shù)器達(dá)到給定
    發(fā)表于 11-09 17:17 ?8358次閱讀
    STM32<b class='flag-5'>看門狗</b>配置(獨立<b class='flag-5'>看門狗</b>IWDG和窗口<b class='flag-5'>看門狗</b>WWDG)

    看門狗定時的相關(guān)問題和實驗說明

    看門狗的作用: 看門狗定時是一個計數(shù)器,基本功能是在發(fā)生軟件問題和程序跑飛后使系統(tǒng)重新啟動。看門狗
    的頭像 發(fā)表于 10-06 12:59 ?4411次閱讀
    <b class='flag-5'>看門狗</b>定時<b class='flag-5'>器</b>的相關(guān)問題和實驗說明

    如何實現(xiàn)模擬看門狗?

    。 啥是看門狗? 一般來講,單片機的看門狗可簡單看成相對獨立的兩部分,即計時單元和監(jiān)控單元。計時單元實現(xiàn)計數(shù)與重裝。在計數(shù)過程中,軟件可以適
    的頭像 發(fā)表于 10-23 14:51 ?5223次閱讀
    如何<b class='flag-5'>實現(xiàn)</b>模擬<b class='flag-5'>看門狗</b>?

    看門狗芯片工作原理

    時間,如果沒有被復(fù)位,計數(shù)器溢出就會對CPU產(chǎn)生一個復(fù)位信號使系統(tǒng)重啟(俗稱“被狗咬”)。系統(tǒng)正常運行時,需要在看門狗允許的時間間隔內(nèi)對看門狗
    的頭像 發(fā)表于 08-09 23:48 ?1.4w次閱讀

    計數(shù)器同步清零和異步清零的區(qū)別

    計數(shù)器清零就是將計數(shù)清零,那么計數(shù)器同步清零和異步清零
    的頭像 發(fā)表于 01-29 16:45 ?3.1w次閱讀