Linux看門狗管理及在DM8168芯片上的應用
⑤初始化本階段使用的硬件設備。
⑥檢測系統(tǒng)內存映射。
⑦將內核從Flash讀取到RAM中。
⑧設置內核啟動參數(shù),然后啟動硬件看門狗,通過訪問控制寄存器來實現(xiàn)。該階段可以設置看門狗超時溢出時間為120 s。以DM8168芯片為例(后面的代碼都是基于該芯片實現(xiàn)),相關代碼為:
__raw_writel(0xBBBB,WDT_WSPR);
__raw_writel(0x4444,WDT_WSPR);
__raw_writel(wdt_trgr_time,WDT_WTGR);
這樣如果后續(xù)的內核解壓及啟動出錯,看門狗超時可以復位開發(fā)板以重啟,重新加載內核并試圖修復。
⑨完成系統(tǒng)初始化工作,U—Boot進入主循環(huán)程序,處理用戶輸入的命令。在abortboot中,關閉看門狗,向控制寄存器依次寫入:
__raw_writel(0xAAAA,WDT_WSPR);
__raw_writel(0x5555,WDT_WSPR);
若收到用戶中斷,U—Boot自動啟動的命令后,關閉看門狗,以方便用戶調試U—Boot、設置內核相關參數(shù)等信息。
⑩如果沒有收到用戶中斷命令,U—Boot會拷貝內核鏡像并解壓內核,開始啟動內核調用。
4.2 內核啟動階段
在U—Boot加載了內核之后,系統(tǒng)就進入內核啟動階段,此時,看門狗的管理控制也要由內核來接管。內核啟動主要包括內核自解壓、注冊及加載硬件驅動程序、Flash分區(qū)等。
在內核啟動時,內核程序會注冊硬件看門狗的驅動程序,并執(zhí)行probe探針函數(shù),此時,內核接管U—Boot階段的看門狗,即先關閉看門狗,然后再重新打開看門狗,并加載新的超時時長,此處設置wdt_trgr_time=120 s。
__raw_writel(0xAAAA,WDT_WSPR);
__raw_writel(0x5555,WDT_WSPR);
__raw_writel(0xBBBB,WDT_WSPR);
__raw_writel(0x4444,WDT_WSPR);
__raw_writel(wdt_trgr_time,WDT_WTGR);
這樣可以保證文件系統(tǒng)在掛載或解壓出錯時,看門狗沒有進行喂狗操作,從而導致120 s超時后重啟。
在注冊完硬件驅動程序之后,內核會掛載根文件系統(tǒng)并進行解壓。
4.3 應用程序啟動階段
文件系統(tǒng)啟動后,用戶的應用進程也會開始啟動。在這個階段,通常會創(chuàng)建一個獨立的守護進程,來接管看門狗。守護進程啟動時,首先關閉內核階段啟動的看門狗,并重新啟動看門狗設置超時時長,實現(xiàn)接管內核階段看門狗的功能。在看門狗啟動后,守護進程可以周期性地進行喂狗操作,并通過心跳的方式同用戶進程通信,在收不到用戶進程的心跳包消息時,即停止喂狗操作,這樣看門狗會超時溢出導致系統(tǒng)重啟,以進行故障修復。
守護進程通過看門狗中斷響應函數(shù),實現(xiàn)重啟系統(tǒng)等操作,以恢復系統(tǒng)可用性。
至此,Linux從U—Boot啟動直到應用程序完成過程中,看門狗都有相應的啟動及管理。
4.4 看門狗管理小結
Linux系統(tǒng)下,U—Boot啟動后打開硬件看門狗,保證內核解壓及啟動出現(xiàn)異常時重啟;內核啟動階段,接管U—Boot下的看門狗并設置時間,可以保證文件系統(tǒng)掛載、解壓及啟動出現(xiàn)異常時重啟系統(tǒng);在進入文件系統(tǒng)后,守護進程接管內核階段的看門狗,并定期地執(zhí)行喂狗操作,這樣在用戶進程出現(xiàn)異常(退出)時,守護進程可以監(jiān)測到異常,停止喂狗操作,看門狗超時復位系統(tǒng)。嵌入式系統(tǒng)中,重啟是從故障中修復的最簡單有效的方法,通過在啟動的不同階段啟用硬件看門狗,可以有效保障系統(tǒng)異常時重啟。
5 DM8168看門狗的管理
除了前文提到的Linux系統(tǒng)下看門狗的基礎管理,DM8168芯片的硬件看門狗外圍輸出引腳,可以同時支持Reset和Interrupt信號,功能更加強大。
如果只是期望看門狗超時后能重啟復位板卡,參考前節(jié)提到的方法,依次在Linux啟動的各個階段啟用及管理看門狗即可,因為看門狗的溢出引腳直接連接電源及復位管理模塊。
此外,如果想在看門狗超時溢出時增加一些額外的處理,可以采用捕獲中斷信號的方法。具體流程如下:
①注冊硬件看門狗中斷處理函數(shù),實現(xiàn)程序為omap_irq=platform_get_resource(pdev,IORESOURCE_IRQ,0); //獲得中斷標號
ret=request_irq(omap_irq,omap_wdt_irqhdl,0,pdev->name,wdev); //注冊中斷
其中omap_wdt_irqhdl為看門狗的中斷處理函數(shù)。
②在硬件看門狗中斷處理函數(shù)中可以增加一些附加的處理,需要注意的是,此時需要設置另外一組寄存器WDT_WDLY,以保證在復位前捕獲到中斷信號。
中斷處理函數(shù)omap_wdt_irqhdl的關鍵實現(xiàn)程序為:
采用此方法后,看門狗超時產生中斷信號,系統(tǒng)捕獲到中斷信號后自動觸發(fā)中斷響應函數(shù),可以更靈活地處理(比如不復位系統(tǒng),保留現(xiàn)場以便定位問題)。
結語
本文以TI公司的TMS320DM8168芯片為例,詳細介紹了Linux系統(tǒng)從U—Boot啟動、內核啟動到文件系統(tǒng)加載及用戶程序啟動過程中看門狗的啟用及管理,通過不同階段管理看門狗,可以保證系統(tǒng)在任何一個可能出現(xiàn)問題的階段,自動重啟以修復故障,從而有效提高系統(tǒng)的可靠性。在嵌入式設備越來越普及的今天,設備自恢復功能會具有極大的競爭力。
評論