?? 方法.txt
字號(hào):
一、指令冗余法
單片機(jī)操作時(shí)序完全由程序計(jì)數(shù)器PC控制,一旦PC因干擾出現(xiàn)錯(cuò)誤,
程序便脫離正常軌道,出現(xiàn)“亂飛”、改變操作數(shù)數(shù)值以及將操作數(shù)誤認(rèn)為
操作碼等。為了使“亂飛”程序迅速納入正軌,應(yīng)該多用單字節(jié)指令,并在
關(guān)鍵地方插入一些空操作指令NOP或?qū)⒂行巫止?jié)指令重寫(xiě),這就叫做指
令冗余。
1. NOP指令的使用:
在雙字節(jié)指令或三字節(jié)指令之后插入兩條NOP指令,可保證其后
的指令不被拆散。在對(duì)程序流向起決定作用的指令
(如RET、ACALL、LJMP、JZ、JNZ、JC、JNC、
DJNZ等)和對(duì)系統(tǒng)狀態(tài)起決定作用的指令(如SETB、EA等)
之前插入兩條NOP指令,使“亂飛”程序迅速納入正軌。
2. 重要指令冗余:
在對(duì)程序流向起決定作用的指令(如RET、ACALL、LCALL
LJMP、JZ、JNZ、JC、JNC等)和某些對(duì)系統(tǒng)狀態(tài)起決定
作用的指令(如SETB、EA等)的后面可重復(fù)寫(xiě)這些指令,以確保
這些指令的正確執(zhí)行。采用冗余法使PC納入正軌的條件是:
跑飛的PC必須指向程序運(yùn)行區(qū),并且必須執(zhí)行到冗余指令。
二、軟件陷阱法
當(dāng)亂飛程序進(jìn)入非程序區(qū)或表格區(qū)時(shí),無(wú)法用冗余指令使程序入軌,此時(shí)
可以編軟件陷阱程序,攔截亂飛程序,將其迅速引向一個(gè)指定位置, 在那里
有程序運(yùn)行出錯(cuò)處理程序,將程序納入正軌。軟件陷阱的形式如下表。
根據(jù)亂飛程序落入陷阱區(qū)的位置不同,可選擇表中的兩種形式之一。
1. 未使用的中斷區(qū)。 當(dāng)未使用的中斷因干擾而開(kāi)放時(shí),在對(duì)應(yīng)的中斷
服務(wù)程序中設(shè)置軟件陷阱,以及時(shí)捕捉錯(cuò)誤的中斷。返回指令用RETI,
中斷服務(wù)程序?yàn)椋? NOP
NOP
POP direct1;將原先斷點(diǎn)彈出
POP direct2
PUSH 00H ;斷點(diǎn)地址改為0000H
PUSH 00H
RETI
說(shuō)明:direct1、direct2為主程序中未使用的單元。
2. 未使用的EPROM空間。 EPROM的存儲(chǔ)空間很少全部用完。
未用的區(qū)域可用0000020000H或020202020000H填滿
最后一條應(yīng)為020000H,當(dāng)亂飛程序進(jìn)入此區(qū)后,便會(huì)迅速入軌。
3.運(yùn)行程序區(qū)。 將陷阱指令組分散放置在用戶程序各模塊之間的空余單
元里。在正常程序中不執(zhí)行這些指令。亂飛程序一旦落入此區(qū),便迅速拉到正
確軌道。
4. 中斷服務(wù)程序區(qū)。 設(shè)用戶主程序運(yùn)行區(qū)間為ADD1~ADD2,
并設(shè)定時(shí)器T0產(chǎn)生10ms定時(shí)中斷。當(dāng)程序亂飛落入ADD1~ADD2
外,并發(fā)生了定時(shí)中斷后,可在中斷服務(wù)程序中判斷中斷斷點(diǎn)地址ADD×,
若ADD×<ADD1或ADD×>ADD2,說(shuō)明發(fā)生了程序亂飛,則應(yīng)使
程序返回到復(fù)位地址0000H,將亂飛程序拉到正確軌道。
假設(shè)ADD1=0100H,ADD2=1000H,2FH、2EH分別為
斷點(diǎn)地址高、低字節(jié)單元,中斷服務(wù)程序?yàn)椋? POP 2FH ;斷點(diǎn)地址彈入2FH、2EH
POP 2EH
PUSH 2EH
PUSH 2FH ;恢復(fù)斷點(diǎn)地址
CLR C ;斷點(diǎn)地址與0100H比較
MOV A,2EH
SUBB A,#00H
MOV A,2FH
SUBB A,#01H
JC LOOPN ;斷點(diǎn)小于0100H則轉(zhuǎn)
MOV A,#00H ;斷點(diǎn)地址與1000H比較
SUBB A,2EH
MOV A,#10H
SUBB A,2FH
JC LOOPN ;斷點(diǎn)大于10000H則轉(zhuǎn)
? ;中斷處理內(nèi)容
?
?
RETI ;正常返回
LOOPN:POP 2FH ;修改斷點(diǎn)地址
POP 2EH
PUSH 00H ;故障斷點(diǎn)為0000H
PUSH 00H
RETI ;故障返回
5. 外部RAM寫(xiě)保護(hù)。 單片機(jī)外部RAM保存大量數(shù)據(jù),其寫(xiě)入指令
為MOVX @DPTR,A。當(dāng)CPU受到干擾而非法執(zhí)行該指令時(shí), 會(huì)
改寫(xiě)RAM中的數(shù)據(jù)。為減?。遥粒椭袛?shù)據(jù)丟失的可能性, 可在RAM寫(xiě)作
之前加入條件陷阱,不滿足條件時(shí)不允許寫(xiě),并進(jìn)入陷阱,形成死循環(huán)。
具體程序?yàn)椋? MOV A,?!痢粒? MOV DPTR,#××××H
MOV 6EH,#55H
MOV 6FH,#0AAH
LCALL WPDPSUB
RET
WPDPSUB:NOP
NOP
NOP
CJNE 6EH,#55H,XYJ ;6EH中不為
;55H則落入死循環(huán)
CJNE 6FH,#0AAH,XYJ ;6FH中不為
;AAH則落死循環(huán)
MOVX @DPTR,A ;A中數(shù)據(jù)寫(xiě)入
;RAM××××H中
NOP
NOP
NOP
MOV 6EH,#00H
MOV 6FH,#00H
RET
XYJ: NOP ;死循環(huán)
NOP
SJMP XYJ
三、看門(mén)狗
“看門(mén)狗”可使程序脫離“死循環(huán)”。“看門(mén)狗”可由硬件實(shí)現(xiàn),可由軟件
實(shí)現(xiàn),也可由兩者結(jié)合來(lái)實(shí)現(xiàn)。軟件看門(mén)狗的基本思路是:在主程序中對(duì)T0
中斷服務(wù)程序進(jìn)行監(jiān)視;在T1中斷服務(wù)程序中對(duì)主程序進(jìn)行監(jiān)視;T0中斷
監(jiān)視T1中斷。從概率統(tǒng)計(jì)的觀點(diǎn),這種相互依存相互制約的抗干擾措施將使
系統(tǒng)的可靠性大大提高。
系統(tǒng)軟件包括主程序、高級(jí)中斷子程序和低級(jí)中斷子程序三部分。假設(shè)將T0
設(shè)計(jì)成高級(jí)中斷,T1設(shè)計(jì)成低級(jí)中斷,從而形成中斷嵌套。主程序流程圖如
圖1所示。主程序完成系統(tǒng)測(cè)控功能的同時(shí),還要監(jiān)視T0中斷因干擾而引起
的中斷關(guān)閉故障。A0為T0中斷服務(wù)程序運(yùn)行狀態(tài)觀測(cè)單元,T0每中斷一
次,A0便自動(dòng)加1。在測(cè)控功能模塊運(yùn)行程序(主程序的主體)入口處,先
將A0值暫存于E0單元。由于測(cè)控功能模塊一般運(yùn)行時(shí)間較長(zhǎng),設(shè)定在此期
間T0產(chǎn)生定時(shí)中斷(設(shè)T0定時(shí)溢出時(shí)間小于測(cè)控功能模塊運(yùn)行時(shí)間),從
而引起A0變化。在測(cè)控功能模塊的出口處,將A0的即時(shí)值與先前的暫存單
元E0的值相比較,觀察A0的值是否發(fā)生變化。若A0的值發(fā)生變化,說(shuō)明
T0中斷運(yùn)行正常;若A0的值沒(méi)變化,說(shuō)明T0中斷關(guān)閉,則轉(zhuǎn)到0000H
處,進(jìn)行出錯(cuò)處理。
T1中斷程序流程圖如圖2所示。T1中斷程序完成系統(tǒng)特定測(cè)控功能的同時(shí),
還要監(jiān)視主程序的運(yùn)行狀態(tài)。在中斷服務(wù)程序中設(shè)置一個(gè)主程序運(yùn)行計(jì)數(shù)器M,
T1每中斷一次,M自動(dòng)加1,M中的數(shù)值與T1定時(shí)溢出時(shí)間之積表示時(shí)間值。
若M表示的時(shí)間值大于主程序運(yùn)行時(shí)間T(為可靠起見(jiàn),T要留有一定余量),
說(shuō)明主程序陷入死循環(huán),T1中斷服務(wù)程序便修改斷點(diǎn)地址,返回0000H,
進(jìn)行出錯(cuò)處理。若M小于T,則中斷正常返回,M在主程序入口處循環(huán)清0,如
圖1所示。
T0中斷程序流程圖如圖3所示。T0中斷程序監(jiān)視T1中斷服務(wù)程序的運(yùn)行
狀態(tài)。該程序較短,受干擾破壞的幾率較小。A1、B1為中斷運(yùn)行狀態(tài)標(biāo)志單
元。A1的初始值為00H,T1每中斷一次,A1自動(dòng)加1。T0中斷程序若
檢測(cè)到A1>0,說(shuō)明T1中斷程序正常;若A1=0,則B1單元加1(B1
的初始值為00H),若B1的累加值大于Q,說(shuō)明T1中斷失效,失效時(shí)間為
T0定時(shí)溢出時(shí)間與Q值之積。Q值的選取取決于T1、T0定時(shí)溢出時(shí)間。
例如,T0定時(shí)溢出時(shí)間為10ms,T1定時(shí)溢出時(shí)間為20ms,當(dāng)Q=4時(shí)
,說(shuō)明T1的允許失效時(shí)間為40ms,在這樣長(zhǎng)的時(shí)間內(nèi),T1沒(méi)有發(fā)生中斷,
說(shuō)明T1中斷發(fā)生了故障。由于T0中斷級(jí)別高于T1中斷,所以T1的任何中斷
故障(死循環(huán)、故障關(guān)閉)都會(huì)因T0的中斷而被檢測(cè)出來(lái)。
當(dāng)系統(tǒng)受到干擾后,主程序可能發(fā)生死循環(huán),中斷程序也可能發(fā)生死循環(huán)或因中
斷方式字的破壞而被關(guān)閉中斷。主程序的死循環(huán)可由T1中斷服務(wù)程序進(jìn)行監(jiān)視;
T0中斷的故障關(guān)閉可由主程序進(jìn)行監(jiān)視;T1中斷服務(wù)程序的死循環(huán)和故障關(guān)閉
可由T0中斷服務(wù)程序進(jìn)行監(jiān)視。由于采用了多重軟件監(jiān)測(cè)方法,大大提高了系統(tǒng)
運(yùn)行的可靠性。
注意:T0中斷服務(wù)程序若因干擾而陷入死循環(huán)。主程序和T1中斷服務(wù)程序無(wú)
法檢測(cè)出來(lái)。因此,應(yīng)盡量縮短T0中斷服務(wù)程序的長(zhǎng)度,降低其發(fā)生死循環(huán)的幾
率。
硬件看門(mén)狗與軟件看門(mén)狗結(jié)合,可獲得良好的抗干擾效果。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -