一種高可靠MCU系統監控方案
對于單片機系統,一般都需要監控電路來(lái)提高系統的可靠性。包括用電壓比較器對電源的監控和看門(mén)狗對程序的監控。為防止系統程序受干擾“飛掉”,常用看門(mén)狗定時(shí)器,這種方式對于系統進(jìn)入死循環(huán)時(shí)很有效,而程序“飛掉”時(shí)極有可能跳過(guò)一段程序,正好進(jìn)入另一條指令的開(kāi)頭。尤其在risc系統中,絕大部分是單周期指令,容易遇到這種情況,此時(shí)程序會(huì )繼續運行下去,使看門(mén)狗失效。跳過(guò)的這段程序,可能包括一些接口控制執行指令,或某些數據的輸入輸出,或條件判斷,整個(gè)系統會(huì )因此而運行紊亂,或直接產(chǎn)生故障。系統出現這類(lèi)故障時(shí)很難立即察覺(jué)。 1. 在運用極其廣泛的一類(lèi)mcu系統,如分段定時(shí)控制系統中,象家用電器的電腦控制微波爐、洗衣機、電飯煲;電力行業(yè)的發(fā)電機轉速控制;冶金行業(yè)的連鑄、焊管及流水線(xiàn)系統等,都可能會(huì )在系統運行中遇到分段定時(shí)控制或某一區域內運行狀態(tài)與前段運行狀態(tài)密切相關(guān)的情況。此時(shí)簡(jiǎn)單地用看門(mén)狗電路作系統監控,一旦出現系統死鎖而復位,將會(huì )使啟動(dòng)以后的整個(gè)運行過(guò)程失效,這種方法顯然是行不通的。
2. 對于分時(shí)多任務(wù)系統,其中的某個(gè)或幾個(gè)任務(wù)出現死鎖,而又有一個(gè)或多個(gè)任務(wù)仍正常運行的情況下,看門(mén)狗定時(shí)器可能會(huì )被“蒙蔽”而失去監控作用。
3. 在一個(gè)程序運行周期很短,或系統根據不同運行狀況的程序處理時(shí)間相差很大的情況下,看門(mén)狗定時(shí)周期難以定得合適,此時(shí)若出現干擾死機可能因難于及時(shí)發(fā)現并解決而造成故障。
如果有一種方法,使系統在運行過(guò)程中能夠自行感知程序運行狀況,出現問(wèn)題能夠隨時(shí)察覺(jué);發(fā)現故障立即報警、停止運行或復位,甚至可以自動(dòng)糾錯,使程序恢復正確的運行,以實(shí)現對程序的最佳監控,那將是比較理想的。
2 系統在線(xiàn)自行跟蹤基本方法
系統在線(xiàn)運行過(guò)程中,如果能夠隨時(shí)將系統運行的過(guò)程即系統當前程序的實(shí)際流程路線(xiàn)自動(dòng)記錄下來(lái),就有辦法將預期的運行路線(xiàn)與之比較,從而避免程序出現不可預測的死鎖。打個(gè)比方,設想有一輛在公路上行駛的汽車(chē),只要知道該汽車(chē)在各個(gè)岔路口的走向,就可以描繪出這輛汽車(chē)整個(gè)的行駛路線(xiàn),但是難以保證汽車(chē)可能會(huì )在一條單一路線(xiàn)上行駛時(shí)拋錨。如果每隔一定距離以及重要路段設上“哨卡”,就能更加細致地了解到汽車(chē)的行駛情況,一旦出現問(wèn)題就能立即知道事故出現的具體路段。同理,在程序運行過(guò)程中也可以通過(guò)人為設置的“哨卡”來(lái)記錄程序當前的運行路線(xiàn)。在多數情況下,這些“哨卡”對系統運行并沒(méi)有太大的影響。 實(shí)際上,這些“哨卡”就是可以任意插入流程中的簡(jiǎn)短程序段,每一個(gè)“哨卡”有一個(gè)特定的“標志碼”以使我們能夠知道程序到底運行到何處。將這些標記按出現的順序記錄在存儲器中,就能依此知道cpu“行駛”的具體路線(xiàn)。當然,對系統的運行狀態(tài)了解得越細致,程序的運行時(shí)間會(huì )越長(cháng)。應將它們設置在重要的數據讀寫(xiě)或接口操作處,各分支路口和相對獨立的程序塊入口處,盡量減小對系統的影響。
下面以gms97c51單片機構成的mcu系統為例說(shuō)明系統對自身運行路線(xiàn)的跟蹤記錄方法。
如圖1所示,設系統cpu為97c51,外接一片sram 6116來(lái)作運行記錄,為防止掉電和死機的影響,將ram用后備電池保護起來(lái)(系統上電初始化程序應包括將6116清零,清零程序在此略去)。

在系統原來(lái)程序段中需要設“哨卡”的地方插入語(yǔ)句:
mov
sign, #mark
;#mark為標志號,sign定義
lcall
guide
;為存放標志號的寄存器地址
這樣,僅插入6個(gè)字節對原來(lái)程序的存儲空間并無(wú)多大影響,所有的“哨卡”共用一個(gè)子程序。
guide:
push psw
; 保護原來(lái)程序可能用到的寄存器,如有必要也可
push acc
;將dptr壓棧保護
inc addr
;addr為標志號存放單元, 上電后需清零
mov a,addr
;假設只用ram中的256個(gè)單元來(lái)做記錄
jz out
;若存儲空間用完則停止存儲記錄
mov dpl,addr
;設6116存儲地址為7f
評論