Linux看門狗管理及在DM8168芯片上的應(yīng)用
摘要:隨著智能手機(jī)及平板為代表的嵌入式設(shè)備的普及,對系統(tǒng)的可靠性提出較高的要求。以TI TMS320DM8168芯片為例,詳細(xì)介紹了Linux系統(tǒng)從U—Boot啟動、內(nèi)核啟動到文件系統(tǒng)加載及用戶程序啟動過程中,看門狗的啟用及管理,通過不同階段管理看門狗,可以保證系統(tǒng)在任意可能出現(xiàn)問題的階段,可以自動重啟以修復(fù)故障,從而有效提高系統(tǒng)的可靠性。
本文引用地址:http://2s4d.com/article/201609/303453.htm引言
隨著智能終端及移動互聯(lián)網(wǎng)的發(fā)展,Linux系統(tǒng)被應(yīng)用到越來越多的嵌入式設(shè)備中,如移動通信基站、Android(基于Linux內(nèi)核)智能手機(jī)、智能手環(huán)等。不同領(lǐng)域的應(yīng)用都對Android/Linux系統(tǒng)的可靠性及可用性有嚴(yán)格的要求。在嵌入式系統(tǒng)中,CPU必須可靠工作,即使因?yàn)槟撤N錯誤或異常進(jìn)入錯誤狀態(tài),系統(tǒng)應(yīng)該可以自動復(fù)位,看門狗也可以在系統(tǒng)進(jìn)入錯誤狀態(tài)后的一段時間內(nèi)重啟復(fù)位,以實(shí)現(xiàn)系統(tǒng)自動從故障恢復(fù)。
1 看門狗的概念
看門狗是一個進(jìn)行累加計(jì)數(shù)的定時器,在其啟動后,如果在設(shè)定的時間間隔內(nèi)對定時器清零(俗稱“喂狗”操作),定時器就不會溢出,也不會產(chǎn)生復(fù)位信號;如果在設(shè)定的時間間隔內(nèi),沒有對定時器清零,定時器就會溢出產(chǎn)生復(fù)位信號,從而實(shí)現(xiàn)系統(tǒng)重啟。根據(jù)實(shí)現(xiàn)方式的不同,可以分為硬件看門狗和軟件看門狗。
硬件看門狗是利用定時器電路實(shí)現(xiàn),其輸出連接到電路的復(fù)位端,程序在設(shè)定間隔內(nèi)對定時器清零。因此程序正常工作時,定時器不會溢出;如果程序出現(xiàn)故障,未能在設(shè)定間隔周期內(nèi)執(zhí)行清零操作,就使得看門狗定時器溢出,產(chǎn)生復(fù)位信號并重啟系統(tǒng)。軟件看門狗原理上同硬件看門狗一樣,只是將硬件電路上的定時器用操作系統(tǒng)內(nèi)部的軟件定時器代替,這樣可以簡化硬件電路設(shè)計(jì)。但軟件定時器在可靠性方面不如硬件定時器,在一些異常的情形下,比如處理器或操作系統(tǒng)內(nèi)部發(fā)生故障時,會導(dǎo)致軟件定時器不可用,也就無法檢測到這些故障。
2 Linux系統(tǒng)對看門狗的支持
Linux內(nèi)核從1.3.51版本開始提供硬件、軟件看門狗的驅(qū)動支持。隨著內(nèi)核版本不斷更新與發(fā)展,Linux內(nèi)核對各種不同類型的硬件看門狗提供了廣泛的支持。根據(jù)訪問方式的不同,Linux系統(tǒng)下的設(shè)備驅(qū)動程序分為字符設(shè)備及塊設(shè)備??撮T狗在Linux系統(tǒng)下作為字符設(shè)備來處理,/dev/watchdog是一個主設(shè)備號為10、從設(shè)備號為130的字符設(shè)備節(jié)點(diǎn)。
Linux系統(tǒng)下的硬件看門狗,必須有硬件電路支持,設(shè)備節(jié)點(diǎn)/dev/watchdog對應(yīng)著真實(shí)的物理設(shè)備,不同類型的硬件看門狗設(shè)備由相應(yīng)的硬件驅(qū)動管理。
軟件看門狗則由Linux內(nèi)核模塊通過定時器機(jī)制實(shí)現(xiàn),此時設(shè)備節(jié)點(diǎn)/dev/watchdog并不對應(yīng)真實(shí)的物理設(shè)備,只是為應(yīng)用提供了一個與操作硬件看門狗相同的接口。各種不同類型的硬件看門狗電路,不僅提供了驅(qū)動程序支持,還提供了一個基于定時器的純軟件看門狗驅(qū)動,其驅(qū)動程序的源碼位于Linux內(nèi)核源碼下面的/drivers/watchdog目錄。
與Linux下的軟件看門狗相比,硬件看門狗具有更高的可靠性。基于Linux內(nèi)核的定時器實(shí)現(xiàn)的軟件看門狗,當(dāng)內(nèi)核或中斷出現(xiàn)異常時,將會失效。而硬件看門狗由自身的硬件電路控制,獨(dú)立于內(nèi)核,無論當(dāng)前系統(tǒng)狀態(tài)如何,如果硬件看門狗在設(shè)定的時間間隔內(nèi)沒有被執(zhí)行寫操作,仍會重新啟動系統(tǒng)。
Linux系統(tǒng)下面的軟件、硬件看門狗對應(yīng)用程序而言是透明的。應(yīng)用程序操作軟件看門狗的方式如下:打開設(shè)備/dev/watchdog,在設(shè)定的時間間隔內(nèi)對/dev/watchdog設(shè)備執(zhí)行寫操作。在任意時刻,只能有一個看門狗驅(qū)動模塊被加載,管理/dev/watchdog設(shè)備節(jié)點(diǎn)。如果系統(tǒng)沒有硬件看門狗電路,可以加載軟件看門狗驅(qū)動模塊。
3 Linux系統(tǒng)下看門狗的訪問
前文提到,Linux系統(tǒng)將看門狗作為一個字符設(shè)備來管理。本節(jié)將以TI公司推出的高清視頻處理芯片TMS320DM8168(以下簡稱DM8168)芯片為例,介紹Linux下訪問及操作看門狗的邏輯層次。
DM8168芯片將高清多通道系統(tǒng)的所有捕獲、壓縮、顯示以及控制功能整合于同一芯片,芯片內(nèi)部集成了硬件看門狗,外圍連接電路如圖1所示。硬件看門狗溢出同時產(chǎn)生復(fù)位(Reset)及中斷信號(Interrupt),復(fù)位信號會復(fù)位整個芯片,中斷信號可以在捕獲到中斷事件后,在中斷處理函數(shù)中增加一些額外的操作(比如將收到的看門狗溢出中斷的時間寫進(jìn)日志,然后再復(fù)位等)。
Linux系統(tǒng)訪問硬件接口需通過設(shè)備驅(qū)動程序接口實(shí)現(xiàn),硬件看門狗也不例外。
如圖2所示,Linux系統(tǒng)下操作看門狗需要以下3個層次:
①Hardware Layer-硬件層,指硬件設(shè)備,通常提供GPIO;
②Kernel Layer-內(nèi)核層,內(nèi)核通過設(shè)備驅(qū)動程序訪問并控制硬件設(shè)備;
③Usee Space-用戶空間,應(yīng)用程序通過內(nèi)核驅(qū)動提供的API接口(通常以打開文件或ioctl方式),提供訪問硬件設(shè)備的接口,比如打開看門狗(int fd = open(“/dev/wat chdog”,O_RDWR))。
4 Linux系統(tǒng)下看門狗的管理
Linux啟動過程依次為U—Boot、內(nèi)核及文件系統(tǒng),最后是應(yīng)用程序啟動。在Linux系統(tǒng)啟動過程中,啟用看門狗可以有效監(jiān)測系統(tǒng)狀態(tài),若異常導(dǎo)致看門狗溢出,系統(tǒng)會自動復(fù)位以試修復(fù)問題,從而提高系統(tǒng)的可靠性及健壯性。本節(jié)以DMS168開發(fā)板為例,介紹Linux各個啟動階段看門狗的管理。
4.1 U—Boot啟動階段
開發(fā)板上電后,執(zhí)行U—Boot的第一條指令,然后順序執(zhí)行U—Boot啟動函數(shù)。U—Boot啟動內(nèi)核的過程如下:
①硬件設(shè)備初始化。
②加載U—Boot第二階段代碼到RAM空間。
③設(shè)置好堆棧,跳轉(zhuǎn)到start_armboot函數(shù)入口。
④start_armboot是U—Boot執(zhí)行的第一個C語言函數(shù)。
評論