本節書摘來異步社群《51單片機應用開發從入門到精通》一書中的第2章,第2.13節,作者:張華傑 ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
51單片機應用開發從入門到精通
在單片機系統的實際應用中,系統的抗幹擾能力顯得非常重要。提高單片機系統的抗幹擾能力除了采取硬體抗幹擾手段外,也可采用軟體抗幹擾的手段,并且軟體抗幹擾具有設計靈活、節省硬體資源、成本低的優點,加以合理運用也能起到很好的抗幹擾效果。
軟體抗幹擾的措施主要有指令備援、軟體陷阱、軟體“看門狗”等。本節通過軟體陷阱執行個體介紹如何編寫軟體抗幹擾程式。
本節首先介紹什麼是程式跑飛以及軟體陷阱技術,接着講述軟體陷阱在程式中的位置,最後将給出軟體陷阱程式執行個體并對軟體陷阱程式進行分析。
單片機程式正常運作時,程式計數器pc始終指向正在執行指令的下一條指令第一個位元組的程式存儲器單元位址,這樣就保證了單片機能夠正确地讀取每一條指令的各個位元組,即cpu先讀取操作碼,再讀取操作數(如果有操作數位元組的話)。在8051單片機中,程式計數器pc的尋址範圍是0000h~ffffh,共64kb。使用者應用程式中,根據系統要求,規定了程式運作的唯一路徑。這展現在系統上電後,程式計數器pc有唯一的變化曆程,保證了程式正常、有序地運作。程式跑飛是指系統受到某種幹擾後,程式計數器pc的值偏離了給定的唯一變化曆程,導緻程式運作偏離正常的運作路徑。
程式跑飛的因素及後果往往是不可預計的。但在很多情況下,程式跑飛後pc指向未寫入資料的flash程式存儲器。由于沒有寫入資料的flash程式存儲器的内容為0ffh,機器碼0ffh對應的指令為mov r7,a,是以系統不斷地執行mov r7,a指令,并很快會執行到程式存儲器的最末尾,進入死循環而導緻當機。這時,采用軟體陷阱技術能有效引導跑飛的程式盡快退出死循環并迅速複位。
軟體陷阱程式主要包括程式跑飛的捕獲和複位處理兩部分,下面對這兩部分分别給出程式執行個體并對程式做詳細解釋。
1.軟體陷阱
軟體陷阱程式段如下:
org 0000h
ljmp main ;程式跳轉到主程式入口
org 0003h
ljmp x0_int ;程式跳轉到外部中斷0中斷服務程式入口
nop ;備援指令
nop
ljmp err ;陷阱
org 000bh
ljmp t0_int ;程式跳轉到t0中斷服務程式入口
nop ;備援指令
org 0013h
ljmp x1_int ;程式跳轉到外部中斷1中斷服務程式入口
org 001bh
ljmp t1_int ;程式跳轉到t1中斷服務程式入口
org 0023h
ljmp s_int ;程式跳轉到串行口中斷服務程式入口
ljmp err ;陷阱<code>`</code>
(2)子程式後面
當使用者應用程式正常運作時,這些軟體陷阱程式段并不會執行,但是當單片機受幹擾而使程式失控時,程式計數器pc指針一旦落入這些陷阱區,就可以馬上将跑飛的程式拉回到正确的軌道。
;……
reti
nop ;備援指令
nop
ljmp err ;陷阱<code>`</code>
(4)在表格區
org 1000h
ljmp err ;陷阱
org 1ffbh
3.複位處理程式
跑飛的程式被軟體陷阱捕捉後,可以直接使用ljmp 0000h指令使程式回到正常的執行狀态。但是由于程式跑飛前的單片機狀态不确定,一些情況下直接使用ljmp 0000h指令使程式傳回正常狀态并不可靠,是以最好加入一段錯誤複位處理程式,将單片機恢複到正常狀态。錯誤複位處理程式執行個體如下: