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