在由單片機(jī)構(gòu)成的微型計(jì)算機(jī)系統(tǒng)中,由于單片機(jī)的工作常常會受到來自外界電磁場的干擾,造成程序的跑飛,而陷入死循環(huán),程序的正常運(yùn)行被打斷,由單片機(jī)控制的系統(tǒng)無法繼續(xù)工作,會造成整個(gè)系統(tǒng)的陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果,所以出于對單片機(jī)運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)測的考慮,便產(chǎn)生了一種專門用于監(jiān)測單片機(jī)程序運(yùn)行狀態(tài)的芯片,俗稱“看門狗”(watchdog)
其作用是使單片機(jī)可以在無人狀態(tài)下實(shí)現(xiàn)連續(xù)工作,其工作原理是:看門狗芯片和單片機(jī)的一個(gè)I/O引腳相連,該I/O引腳通過程序控制它定時(shí)地往看門狗的這個(gè)引腳上送入高電平(或低電平),這一程序語句是分散地放在單片機(jī)其他控制語句中間的,一旦單片機(jī)由于干擾造成程序跑飛后而陷入某一程序段 進(jìn)入死循環(huán)狀態(tài)時(shí),寫看門狗引腳的程序便不能被執(zhí)行,這個(gè)時(shí)候,看門狗電路就會由于得不到單片機(jī)送來的信號,便在它和單片機(jī)復(fù)位引腳相連的引腳上送出一個(gè)復(fù)位信號,使單片機(jī)發(fā)生復(fù)位,即程序從程序存儲器的起始位置開始執(zhí)行,這樣便實(shí)現(xiàn)了單片機(jī)的自動(dòng)復(fù)位。
單片機(jī)看門狗電路的作用
看門狗的作用: 看門狗定時(shí)器是一個(gè)計(jì)數(shù)器,基本功能是在發(fā)生軟件問題和程序跑飛后使系統(tǒng)重新啟動(dòng)。看門狗計(jì)數(shù)器正常工作時(shí)自動(dòng)計(jì)數(shù),程序流程定期將其復(fù)位清零,如果系統(tǒng)在某處卡死或跑飛,該定時(shí)器將溢出,并將進(jìn)入中斷。在定時(shí)器中斷中執(zhí)行一些復(fù)位操作,使系統(tǒng)恢復(fù)正常的工作狀態(tài),即在程序沒有正常運(yùn)行期間,如期復(fù)位看門狗以保證所選擇
的定時(shí)溢出歸零,使處理器重新啟動(dòng)。軟件的可靠性一直是一個(gè)關(guān)鍵問題。任何使用軟件的人都可能會經(jīng)歷計(jì)算機(jī)死機(jī)或程序跑飛的問題,這種情況在嵌入式系統(tǒng)中也同樣存在。由于單片機(jī)的抗干擾能力有限,在工業(yè)現(xiàn)場的儀器儀表中,常會由于電壓不穩(wěn)、電弧干擾等造成死機(jī)。在水表、電表等無人看守的情況下,也會因系統(tǒng)遭受干擾而無法重啟。為了保證系統(tǒng)在干擾后能自動(dòng)恢復(fù)正常,看門狗定時(shí)器(Watchdog Timer)的利用是很有價(jià)值的。
現(xiàn)今市面上流行的一些單片機(jī),多嵌有內(nèi)部WDT,如TI的MSP430系列,Philips的P87XXX和P89XXX系列,Microchip的PIC列,Atmel的AT89SXX系列和Holtek公司的Htxxx系列。但是這些內(nèi)部看門狗在工作時(shí),多存在一定的誤差。一些工程師在設(shè)計(jì)的過程中,由于忽略了這一點(diǎn),導(dǎo)致系統(tǒng)出現(xiàn)異常。MSP430系列單片機(jī)是美國德州儀器公司(TI)近幾年開發(fā)的新一代單片機(jī),該系列是一款16位、具有精簡指令集、超低功耗的全新概念混合型單片機(jī)。在眾多單片機(jī)系列中,由于它具有極低的功耗、豐富的片內(nèi)外設(shè)和方便靈活的開發(fā)手段,已成為一顆耀眼的新星。其內(nèi)部自帶看門狗及復(fù)位電路,理論上如果程序跑飛,可用看門狗將其復(fù)位。但在實(shí)際使用過程中,發(fā)現(xiàn)看門狗的作用并非萬無一失,以下實(shí)驗(yàn)證明了這一點(diǎn)。實(shí)驗(yàn)電路如圖1所示。
試驗(yàn)程序清單:
#include《msp430x12.h》
void main(void){
p1dir l=0x0f; //設(shè)置p1.2-.p1.0為輸出
for(;;){
volatile unsigned int i;
wdtctl=wdtpw+wdtcncl;
//復(fù)位wdt
piout==0x0t;
i=5000;
do(i--)
while(i!=0);
}}
上述實(shí)驗(yàn)啟動(dòng)后,如果程序正常運(yùn)行,LED會閃爍。缺省時(shí),MSP430的看門狗是允許狀態(tài),所運(yùn)行的程序會不斷地訪問看門狗。理論上,這個(gè)系統(tǒng)是不會發(fā)生啟動(dòng)失敗的,因?yàn)榧词箚?dòng)失敗,看門狗也應(yīng)該在數(shù)百毫秒內(nèi)啟動(dòng),復(fù)位整個(gè)系統(tǒng)?;谶@種思想,對單片機(jī)的復(fù)位進(jìn)行測試。K2斷開,用K1連續(xù)產(chǎn)生。Reset信號,測試看門狗使系統(tǒng)重啟的成功率。K2閉合,則reset端高電平,理論上K1不能有效產(chǎn)生復(fù)位脈沖,觀察看門狗是否起作用。
實(shí)驗(yàn)結(jié)果與分析
實(shí)驗(yàn)結(jié)果如下:K2斷開,連續(xù)開關(guān)K1,上電重啟系統(tǒng),平均155次失敗1次(LED不閃),即看門狗失效概率0.6%;K2閉合,連續(xù)開關(guān)K1,平均18次失敗1次(LED不閃),且一旦失敗,將連續(xù)失敗下去,看門狗無效率占到了約5.5%。另外,當(dāng)采用同樣具有內(nèi)置看門狗的其他系列單片機(jī)替代實(shí)驗(yàn)中的MSP430,啟動(dòng)程序段作相應(yīng)修改時(shí),實(shí)驗(yàn)結(jié)果仍大致相同,這說明具有內(nèi)置看門狗的單片機(jī)面臨的問題是相同的。經(jīng)分析可能有如下原因:
?、儆捎诳撮T狗的時(shí)鐘不獨(dú)立,計(jì)數(shù)時(shí)鐘與系統(tǒng)為同一分頻鏈路,因此看門狗不能在系統(tǒng)出現(xiàn)問題時(shí)有效運(yùn)作。
②由于時(shí)鐘可用軟件設(shè)置,啟動(dòng)失敗時(shí),開機(jī)時(shí)鐘可能處于空檔,沒有時(shí)鐘看門狗不能生效。
③有些看門狗需要用軟件設(shè)置或啟動(dòng),因此啟動(dòng)失敗后,初始化程序沒有激活,CPU可能跳轉(zhuǎn)到隨機(jī)代碼,使看門狗被禁止。這樣的看門狗是需要有可靠的上電復(fù)位作保證的,因此,從理論上講,原設(shè)計(jì)存在著不合理性。基于上述分析,采用片外看門狗專用芯片TPS3823由獨(dú)立的分頻振蕩電路提供計(jì)數(shù)脈沖。實(shí)驗(yàn)電路如圖2所示。
上述電路中,TPS3823輸出定時(shí)溢出信號給Reset端。程序段中,CPU要不斷地通過I/O口輸出喂狗信號,使看門狗計(jì)數(shù)器清零。在此電路中重復(fù)上述試驗(yàn)中K1、K2的相同動(dòng)作,系統(tǒng)重啟成功率達(dá)到100%。
未來的內(nèi)置看門狗必須有獨(dú)立可靠的時(shí)鐘。系統(tǒng)上電后,看門狗即為允許狀態(tài),無需軟件設(shè)置,它只能被外部硬件跳線或內(nèi)部熔絲(fuse)所禁止。目前,如果要求設(shè)計(jì)可靠性較高的嵌入式系統(tǒng),外置看門狗是必須考慮的。內(nèi)置看門狗的另一問題是系統(tǒng)復(fù)位后,程序應(yīng)判斷是由Reset端正常上電復(fù)位,還是程序跑飛看門狗所致,由此確定現(xiàn)場數(shù)據(jù)是否應(yīng)該保留。這也是在看門狗應(yīng)用中所應(yīng)考慮的。
看門狗系統(tǒng)設(shè)計(jì)技巧
外部看門狗是嵌入式系統(tǒng)工程師工具箱里重要且關(guān)鍵的工具,然而為了捕捉到故障,且預(yù)防故障的發(fā)生,看們狗必須設(shè)計(jì)得當(dāng)。因此設(shè)計(jì)一個(gè)看門狗系統(tǒng)時(shí)應(yīng)考慮以下5個(gè)秘訣。
技巧1—監(jiān)測心跳
一個(gè)外部看門狗須具備的最簡單功能是監(jiān)測由主應(yīng)用處理器產(chǎn)生的一個(gè)定期“心跳(Heartbeat)”信號,以及在心跳異常時(shí)發(fā)出一個(gè)錯(cuò)誤信號。心跳監(jiān)測可做為兩種不同的用途:首先,在經(jīng)過已在軟件執(zhí)行的功能檢查之后,微控制器(MCU)應(yīng)該只是生成心跳,以確保軟件的正常工作。第二,如果系統(tǒng)的實(shí)時(shí)響應(yīng)已受到損害,心跳應(yīng)該要能顯示出來。
為軟件功能和實(shí)時(shí)響應(yīng)監(jiān)測心跳,可透過一個(gè)使用簡單,“啞巴(Dumb)”的外部看門狗。外部看門狗應(yīng)該有沿著一個(gè)心跳必須出現(xiàn)的窗口的能力調(diào)派一個(gè)心跳周期,心跳窗口的作用是當(dāng)系統(tǒng)的實(shí)時(shí)響應(yīng)受到損害時(shí),允許看門狗進(jìn)行檢測。而在該功能或?qū)崟r(shí)檢查失敗的情況下,看門狗會試圖透過應(yīng)用處理器的重置來恢復(fù)系統(tǒng)。
技巧2—采用一個(gè)低效能MCU
簡易基于定時(shí)器的外部看門狗可在相對低成本的狀況下監(jiān)控心跳,但這會嚴(yán)重限制看門狗系統(tǒng)的能力和恢復(fù)的可能性。其實(shí),低效能微控制器就可以做為外部看門狗的定時(shí)器,所以何不為看門狗增添一些智能且采用微控制器呢?微控制器的固件(Firmware)可被開發(fā)用來滿足增加許多功能的心跳監(jiān)測窗口所需。
一個(gè)“聰明”的看門狗有時(shí)被稱為監(jiān)督者或安全看門狗,且已在不同的產(chǎn)業(yè),如汽車領(lǐng)域?qū)嶋H使用了許多年;另外,通?;谖⒖刂破鞯目撮T狗以被主要用于安全關(guān)鍵應(yīng)用。目前開發(fā)工具已相當(dāng)可用且硬件成本也低,這樣的設(shè)計(jì)具成本效益,且在其他的應(yīng)用中亦是如此。
技巧3—監(jiān)督關(guān)鍵的系統(tǒng)功能
使用一個(gè)小微控制器作為看門狗的決定,可開啟看門狗該如何使用的無限可能。其中可賦予智能看門狗的第一個(gè)角色通常是監(jiān)督的重要系統(tǒng)功能,如系統(tǒng)電流或傳感器狀態(tài)。看門狗如何能監(jiān)督電流的一個(gè)例子是,采取一個(gè)電流的獨(dú)立測量,并提供監(jiān)測值給應(yīng)用處理器,之后,應(yīng)用處理器可比較看門狗與自身讀取到的數(shù)值。若是兩者之間有分歧,則系統(tǒng)將執(zhí)行故障樹(FaultTree)此一被應(yīng)用程序視為適當(dāng)?shù)姆绞健?/p>
技巧4—觀察一個(gè)信道
有時(shí)嵌入式系統(tǒng)可像個(gè)看門狗且應(yīng)用處理器也可以如期工作,但外部的檢查員是處于非響應(yīng)的狀態(tài)。在這樣的狀態(tài)下,綁定智能看門狗到一個(gè)信道如通用異步收發(fā)器(UART)是可行的。當(dāng)看門狗被連接到信道時(shí),不僅可以監(jiān)控通道流量,還可以接收對看門狗而言的特定指令。
在這方面一個(gè)很好的例子是專為小型衛(wèi)星設(shè)計(jì)的看門狗,其可監(jiān)視飛行器計(jì)算機(jī)和地面基地臺間的無線電通信。如果飛行器計(jì)算機(jī)變得不響應(yīng)無線電,看門狗將接收到一個(gè)命令,然后執(zhí)行并重置飛行器計(jì)算機(jī)。
技巧5—考慮外部定時(shí)重置功能
采用一個(gè)微控制器執(zhí)行看門狗,會有額外功能增加其復(fù)雜性,以及一個(gè)新軟件單元到系統(tǒng)的設(shè)計(jì),因此,系統(tǒng)中看門狗的問題無疑是由工程師的頭腦來監(jiān)看。在看門狗自行“放大假”的情況下,其將如何恢復(fù)?
選擇之一是使用前面討論的啞巴外部看門狗定時(shí)器。智能看門狗會由啞巴看門狗的定時(shí)器,使其從被重置的狀況下生成心跳;另一個(gè)選擇是讓應(yīng)用處理器的行為就像個(gè)看門狗。這里須小心思考,給予最佳的方式以確保兩個(gè)處理器如預(yù)期地保持正常狀態(tài)。
簡單設(shè)計(jì)確??撮T狗可行性
智能看門狗的目的是監(jiān)測系統(tǒng)和主微控制器,以確保它們依預(yù)期運(yùn)作。在系統(tǒng)設(shè)計(jì)中,看門狗可允許其所支持的非常多功能,開發(fā)者需要牢記,增加智能看門狗復(fù)雜度的可能性,且看門狗本身須包含潛在的故障模式和錯(cuò)誤。更重要的是,看門狗的設(shè)計(jì)應(yīng)保持簡單與采用最小的必要功能集,將可確保其可被徹底測試和驗(yàn)證。
看門狗技術(shù)及其抗干擾措施
隨著工業(yè)自動(dòng)化水平的不斷提高,以MCS-51單片機(jī)為核心所構(gòu)成的單片機(jī)應(yīng)用系統(tǒng)得到了廣泛應(yīng)用,如水泥生料配料系統(tǒng)、電子皮帶秤給料控制、各種現(xiàn)場智能測量儀表等。但其工作現(xiàn)場條件惡劣,干擾多而且幅度大,嚴(yán)重影響著應(yīng)用系統(tǒng)的正常運(yùn)行與可靠性,甚至使應(yīng)用系統(tǒng)計(jì)算機(jī)進(jìn)入死循環(huán)而癱瘓,通常稱為程序“跑飛”。由此引出的計(jì)算機(jī)可靠性問題,一直是人們研究的重要課題。
采用屏蔽、濾波、退耦、隔離、接地等措施能有效地提高系統(tǒng)的抗干擾能力,但很難在強(qiáng)干擾發(fā)生時(shí)消除因程序“跑飛”而死機(jī)情況的發(fā)生?!翱撮T狗”技術(shù)能在程序“跑飛”時(shí)實(shí)現(xiàn)自我診斷并使系統(tǒng)恢復(fù)運(yùn)行,是單片機(jī)應(yīng)用系統(tǒng)抗干擾的有力武器。當(dāng)然,它是以系統(tǒng)的硬、軟件設(shè)計(jì)開發(fā)的合理和成熟為條件的,否則將掩蓋系統(tǒng)設(shè)計(jì)開發(fā)過程中的人為缺陷與不足。
“看門狗”技術(shù)及其對干擾的抑制
1、程序“跑飛”對系統(tǒng)的攻擊
?。?)程序計(jì)數(shù)器PC的值被攻擊,成為一隨機(jī)拼合的數(shù)據(jù)。
(2)系統(tǒng)設(shè)置的控制字與標(biāo)志參數(shù)因“跑飛”后可能被訪問而被攻擊。
?。?)數(shù)據(jù)存儲器RAM內(nèi)容被攻擊等。
2、 “看門狗”技術(shù)
“看門狗”源于“Watch dog、Watch dog timer”,或稱定時(shí)監(jiān)視技術(shù),其本質(zhì)是一可復(fù)位的定時(shí)器,其原理如圖1、2所示。
在程序正常運(yùn)行時(shí),計(jì)算機(jī)通過程序以周期T1向定時(shí)器發(fā)送脈沖觸發(fā)定時(shí)器(或通過軟件以T1為周期初始化定時(shí)器),而由定時(shí)脈沖控制的定時(shí)器動(dòng)作時(shí)間為T2(T3),在T1<T2(T3)時(shí),定時(shí)器不會動(dòng)作,處于休眠狀態(tài)。當(dāng)計(jì)算機(jī)受到強(qiáng)干擾等作用破壞后,程序計(jì)數(shù)器PC中內(nèi)容不再是程序的正確代碼,而可能為一隨機(jī)拼合的數(shù)據(jù),這樣會使取指不正確,必然導(dǎo)致程序運(yùn)行混亂“跑飛”,進(jìn)入死循環(huán)而死機(jī)。反過來由于程序脫離正常循環(huán),也使定時(shí)器觸發(fā)脈沖丟失,在經(jīng)過T2(T3)時(shí)間后,“看門狗”定時(shí)器被激活,向CPU發(fā)出Reset信號使其復(fù)位,將“跑飛”的程序從PC=0000H開始,納入正常軌道。但有些生產(chǎn)過程是不能從頭開始的,應(yīng)用程序均是一循環(huán)體,且在開始處均有初始化程序,包含各種寄存器、指針、變量、控制字等。此時(shí)狀態(tài)不能反應(yīng)“跑飛”時(shí)的狀態(tài),有時(shí)還有人身、設(shè)備等方面的安全危險(xiǎn)。在這種情況下,程序“跑飛”后應(yīng)設(shè)法找到出錯(cuò)時(shí)的斷點(diǎn),此時(shí)就可以采用二級“看門狗”的方式。由程序設(shè)計(jì)時(shí)優(yōu)先級設(shè)置為最高級的定時(shí)器一先發(fā)出中斷請求信號,CPU響應(yīng)中斷轉(zhuǎn)向中斷處理程序,進(jìn)而恢復(fù)系統(tǒng)。第二級“看門狗”電路只有在第一級未起作用時(shí)經(jīng)過T3才起動(dòng)Reset信號。
3、 “看門狗”技術(shù)的實(shí)施方法
?。?)在系統(tǒng)構(gòu)成時(shí)選用芯片內(nèi)帶有“看門狗”電路的單片機(jī),如ATMEL公司的89C52等。
(2)選配專門的“看門狗”電路,如美國Xicor公司的X25043/45、MAXIM公司的MAX813L等,它們均可構(gòu)成獨(dú)立的“看門狗”電路。
?。?)采用計(jì)數(shù)器、單穩(wěn)態(tài)觸發(fā)器、定時(shí)器等器件構(gòu)成。在圖3中用4060構(gòu)成了一個(gè)二級“看門狗”電路。
因/I/N/T/O中斷入口0003H處僅有0003H~000AH單元可為中斷服務(wù)程序所用,很可能容納不下中斷服務(wù)程序,故應(yīng)在其內(nèi)安排一條JMP Watch dog指令。由于“跑飛”,PC值在響應(yīng)中斷前已被破壞,在響應(yīng)中斷后,該內(nèi)容自動(dòng)被壓入堆棧,故一定要用兩條POP A指令將無用內(nèi)容彈出,以便為中斷返回時(shí)由堆棧給PC賦予“跑飛”處的正確值,這一點(diǎn)在設(shè)計(jì)中斷服務(wù)程序時(shí)尤其要引起重視。通過對P1.0取反,恢復(fù)對4060的觸發(fā)脈沖。在中斷服務(wù)中應(yīng)安排被破壞數(shù)據(jù)的診斷、修復(fù)以及查找“跑飛”處的地址正確入口,并在返回前將其壓棧。當(dāng)執(zhí)行RETI時(shí),“跑飛”處斷點(diǎn)地址入口自動(dòng)彈棧到PC,恢復(fù)正常運(yùn)行。P1.0取反指令在何處插入應(yīng)通過計(jì)算指令周期讓兩條CLR P1.0指令間隔小于定時(shí)器的定時(shí)時(shí)間T1<T2,可取T2=(1.5~2)T1。
?。?)利用8031片內(nèi)定時(shí)器/計(jì)數(shù)器 8031片內(nèi)有兩個(gè)十六位的定時(shí)器/計(jì)數(shù)器,可用定時(shí)器T0。在應(yīng)用程序?qū)0初始化時(shí),將其定時(shí)時(shí)間T2設(shè)置得比應(yīng)用程序循環(huán)體執(zhí)行時(shí)間T1長,可取:T2=(1.5~2)T1。當(dāng)程序正常時(shí),T0不會溢出,“跑飛”時(shí)溢出,定時(shí)器/計(jì)數(shù)器控制寄存器TCON的TF0(TCON.5)由8031內(nèi)部硬件置位TF0=1,發(fā)出中斷信號。設(shè)8031采用12MHz晶振,經(jīng)定時(shí)器內(nèi)部12分頻后得1MHz的定時(shí)時(shí)鐘,對應(yīng)定時(shí)時(shí)間1μs,最長可定時(shí)約65.5ms,如應(yīng)用程序循環(huán)時(shí)間T1=10ms,則可取T2=2T1=20ms,定時(shí)器的初值X可由下式確定:
?。?16-X)×1μs=20ms
X=45536D=B1EOH
定時(shí)器的初始化程序:
MOV TLO,#OEOH
MOV THO,#OB1H;定時(shí)器/計(jì)數(shù)器T0寫入初值
MOV TMOD,#O1H;設(shè)置定時(shí)器/計(jì)數(shù)器工作方式1
SETB TRO; 起動(dòng)定時(shí)器/計(jì)數(shù)器T0
在應(yīng)用程序的系統(tǒng)初始化時(shí)用下面指令設(shè)定T0優(yōu)先級:
SETB EA; 開放中斷
SETB ETO; 允許T0中斷
SETB PTO; 置T0中斷優(yōu)先級最高
T0中斷服務(wù)流程與/I/N/T/O中斷服務(wù)流程(見圖4)相比,其中斷入口為000BH,去掉P1.0取反的指令,其余相同??績?yōu)先級別最高的中斷將控制權(quán)重新奪回交給CPU,使系統(tǒng)恢復(fù)正常。
6
4、 斷點(diǎn)的查找與恢復(fù)
斷點(diǎn)的查找與恢復(fù)是人們最關(guān)注的問題,我們的方法是擴(kuò)展一外部數(shù)據(jù)存儲器,用以存儲“跑飛”前斷點(diǎn)(或接近斷點(diǎn))的PC之值以及一些重要的變量、指針及控制字的值。利用正常工作時(shí)P1.0向“看門狗”發(fā)送的觸發(fā)脈沖經(jīng)反向、延時(shí)等作為外部擴(kuò)展RAM的片選信號以T1為周期定時(shí)對外部RAM中內(nèi)容進(jìn)行刷新。當(dāng)“跑飛”后因觸發(fā)脈沖丟失而避免了外部RAM被攻擊,保證其內(nèi)容的可靠性。隨著T1的減少,被恢復(fù)的值就愈趨近斷點(diǎn)值,但要非常準(zhǔn)確找到斷點(diǎn),還值得人們研究。在中斷響應(yīng)時(shí)由于P1.0恢復(fù)了輸出觸發(fā)脈沖,故可將斷點(diǎn)值讀出。
結(jié)束語
“看門狗”是對付“跑飛”的有力手段,在生產(chǎn)過程中由于特定的生產(chǎn)條件使得“看門狗”技術(shù)有其相當(dāng)?shù)淖饔?。我們在對某水泥廠微機(jī)配料系統(tǒng)的技術(shù)改造過程中采用了二級“看門狗”技術(shù),該系統(tǒng)運(yùn)行兩年多來經(jīng)受住了各種強(qiáng)干擾的考驗(yàn),取得了令人滿意的效果。
對于“跑飛”后的診斷、恢復(fù),尤其是如何更準(zhǔn)確地找到程序“跑飛”斷點(diǎn),對被損數(shù)據(jù)加以恢復(fù)等方面盡管有許多軟件可以利用,但還是值得人們多加關(guān)注的問題。
評論
查看更多