<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Linux的嵌入式系統全程喂狗策略

基于Linux的嵌入式系統全程喂狗策略

作者: 時(shí)間:2009-05-12 來(lái)源:網(wǎng)絡(luò ) 收藏

  引 言

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

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

  本文提出了一種嵌入式系統全程喂狗策略及實(shí)現方法,從系統上電、引導程序(Bootloader)、操作系統內核直至應用階段都啟用看門(mén)狗。實(shí)驗表明,該方法簡(jiǎn)單可行,成本較低,在嵌入式系統的全過(guò)程中都可以實(shí)現喂狗策略,提高了系統可靠性。

  1 系統總體設計

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

  1.1 看門(mén)狗電路設計

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

看門(mén)狗電路原理

  1.2 喂狗策略及實(shí)現

  1.2.1 Bootloader階段

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

  首先在特定平臺的定義頭文件include/conffigs/xxx.h中加入看門(mén)狗的宏定義:

程序

  在lib_generic下的CRC校驗階段代碼crc32.c中加入如下代碼,實(shí)現CRC校驗階段喂狗:

程序

  1.2.2 Linux內核階段

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

  以上內核階段的劃分是以GPIO及Watchdog驅動(dòng)的加載為標志的。GPIO驅動(dòng)加載之前為內核階段1,GPIO驅動(dòng)加載之后至Watchdog驅動(dòng)加載之前為內核階段2,Watchdog驅動(dòng)加載之后為內核階段3。

  下面示例說(shuō)明內核解壓縮asm/arch/boot/compressed.c中喂狗的實(shí)現代碼:

程序

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

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

程序

  為了能夠在內核階段3調用Watchdog驅動(dòng)進(jìn)行喂狗,需要在Watchdog驅動(dòng)中導出喂狗函數以供內核階段3使用。Watchdog驅動(dòng)喂狗也是調用GPIO驅動(dòng)實(shí)現的,但Watchdog驅動(dòng)一旦加載完成,以后的喂狗都通過(guò)調用Watchdog驅動(dòng)完成。

程序

  1.2.3 程序運行階段

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

多線(xiàn)程應用程序運行階段喂狗方法

  以下示例說(shuō)明在應用中如何調用Watchdog驅動(dòng)實(shí)現喂狗:

程序

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

喂狗程序采取調用Watchdog驅動(dòng)的方法進(jìn)行

  2 實(shí)驗結果

  我們在公司研發(fā)的智能視頻分析器項目中應用了本方法。該分析器采用TI DaVinci系列DSP芯片(TMS320DM6446)為CPU,用Monta Vista Linux作為操作系統。操作系統啟動(dòng)時(shí)間約為20~30 s。采用本方法是為了保證系統在全過(guò)程中都能得到有效的失效恢復。在振蕩波抗擾度、電壓波動(dòng)與閃爍、靜電放電、電快速瞬變脈沖群等EMC兼容性測試中,當各強度指標超過(guò)設備EMC兼容性設計強度時(shí),系統失效,利用這種方式可以測試本方法在硬件失效時(shí)的效果。以靜電放電為例,設計放電等級為±6 kV(我們取±7 kV的強度等級),設備上電后,分別在1~30 s內每隔5 s及在120 s處進(jìn)行靜電放電測試,經(jīng)觀(guān)察設備都可以即時(shí)恢復。

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

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

  結 語(yǔ)

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


關(guān)鍵詞: Linux 看門(mén)狗 IMP706

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>