天天看點

《51單片機應用開發從入門到精通》——2.13 軟體陷阱執行個體

本節書摘來自異步社群《51單片機應用開發從入門到精通》一書中的第2章,第2.13節,作者 張華傑,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

在單片機系統的實際應用中,系統的抗幹擾能力顯得非常重要。提高單片機系統的抗幹擾能力除了采取硬體抗幹擾手段外,也可采用軟體抗幹擾的手段,并且軟體抗幹擾具有設計靈活、節省硬體資源、成本低的優點,加以合理運用也能起到很好的抗幹擾效果。

軟體抗幹擾的措施主要有指令備援、軟體陷阱、軟體“看門狗”等。本節通過軟體陷阱執行個體介紹如何編寫軟體抗幹擾程式。

本節首先介紹什麼是程式跑飛以及軟體陷阱技術,接着講述軟體陷阱在程式中的位置,最後将給出軟體陷阱程式執行個體并對軟體陷阱程式進行分析。

單片機程式正常運作時,程式計數器pc始終指向正在執行指令的下一條指令第一個位元組的程式存儲器單元位址,這樣就保證了單片機能夠正确地讀取每一條指令的各個位元組,即cpu先讀取操作碼,再讀取操作數(如果有操作數位元組的話)。在8051單片機中,程式計數器pc的尋址範圍是0000h~ffffh,共64kb。使用者應用程式中,根據系統要求,規定了程式運作的唯一路徑。這展現在系統上電後,程式計數器pc有唯一的變化曆程,保證了程式正常、有序地運作。程式跑飛是指系統受到某種幹擾後,程式計數器pc的值偏離了給定的唯一變化曆程,導緻程式運作偏離正常的運作路徑。

程式跑飛的因素及後果往往是不可預計的。但在很多情況下,程式跑飛後pc指向未寫入資料的flash程式存儲器。由于沒有寫入資料的flash程式存儲器的内容為0ffh,機器碼0ffh對應的指令為mov r7,a,是以系統不斷地執行mov r7,a指令,并很快會執行到程式存儲器的最末尾,進入死循環而導緻當機。這時,采用軟體陷阱技術能有效引導跑飛的程式盡快退出死循環并迅速複位。

軟體陷阱程式主要包括程式跑飛的捕獲和複位處理兩部分,下面對這兩部分分别給出程式執行個體并對程式做詳細解釋。

1.軟體陷阱

軟體陷阱程式段如下:

當單片機系統工作正常時,單片機不會執行軟體陷阱程式段。但是當單片機系統受到幹擾而程式跑飛後,由于程式計數器pc值錯誤,破壞了正常的指令格式,導緻執行非正常指令,進而執行軟體陷阱程式段,落入軟體陷阱,将跑飛的程式引導到軟體陷阱複位入口位址err。

軟體陷阱程式段中的連續2條nop指令實際上也就是指令備援的抗幹擾方法,目的是為了增強ljmp err被執行的能力,即ljmp err指令不會被沖散,當程式跑飛後會得到完整地執行,進而使跑飛的程式納入正常軌道。

2.軟體陷阱在程式中的位置

下面将根據軟體陷阱在程式中的不同位置,給出軟體陷阱程式的具體執行個體。

(1)未使用的中斷向量區

在未使用的中斷向量區放上軟體陷阱,就可以及時捕捉到錯誤的中斷。在未使用的中斷向量區放置軟體陷阱的執行個體如下:

(2)子程式後面

當使用者應用程式正常運作時,這些軟體陷阱程式段并不會執行,但是當單片機受幹擾而使程式失控時,程式計數器pc指針一旦落入這些陷阱區,就可以馬上将跑飛的程式拉回到正确的軌道。

(3)中斷服務程式後面

(4)在表格區

(5)未使用的程式存儲器空間

如上文所述,程式一旦跑飛到未使用的程式存儲器空間,将會飛流直下,一般在一些固定的位址加入軟體陷阱,捕獲跑飛的程式。

3.複位處理程式

跑飛的程式被軟體陷阱捕捉後,可以直接使用ljmp 0000h指令使程式回到正常的執行狀态。但是由于程式跑飛前的單片機狀态不确定,一些情況下直接使用ljmp 0000h指令使程式傳回正常狀态并不可靠,是以最好加入一段錯誤複位處理程式,将單片機恢複到正常狀态。錯誤複位處理程式執行個體如下:

使用以上的錯誤複位處理程式主要是由于程式受到幹擾而跑飛是随機發生的,如果程式跑飛前正處于中斷狀态,直接跳轉到程式起始位置0000h并不能使單片機回到正常工作狀态(中斷激活标志未清除)。在8051單片機中,能夠清除中斷激活标志的指令隻有reti指令,因而可以利用reti指令使單片機回到正常狀态。而在最嚴重的情況下,程式跑飛時,單片機正處于兩級中斷嵌套的狀态,此時需要通過兩個reti指令才能使單片機回到正常狀态。下面我們看看上面的錯誤複位處理程式執行個體是如何使單片機回到正常狀态的。

程式(1)關閉中斷,使錯誤複位處理程式不受到中斷信号的影響。程式(2)~(4)将err1的位址壓入堆棧中。程式(5)使用reti指令清除進階中斷激活标志,同時使程式跳轉到err1處繼續執行。程式(6)~(8)将位址0000h壓入堆棧中。程式(9)再次使用reti指令清除低級中斷激活标志,同時使程式跳轉到起始位置0000h。通過這一系列操作,才能真正可靠地将單片機恢複到正常狀态,并從程式起始位置重新開始執行。

本執行個體詳細解釋了軟體陷阱的作用、原理,并給出了軟體陷阱的程式執行個體。本執行個體需要注意以下兩點。

 在程式的恰當位置放置軟體陷阱,可以在一定程度上加強抗幹擾能力。但是軟體陷阱的作用是有限的,在抗幹擾要求高的情況下,還應當和“看門狗”等硬體抗幹擾手段結合使用。

 軟體陷阱最好不要将程式直接引導向啟動位址0000h,而應當加入一段如上文所示的錯誤複位處理程式。在錯誤複位處理程式中,除通過本執行個體給出的這些指令操作使單片機的狀态恢複正常外,還可加入一些儲存關鍵資料的操作。

繼續閱讀