|
近年來單片機(jī)系統(tǒng)在工業(yè)測(cè)控領(lǐng)域的應(yīng)用越來越廣泛,而對(duì)于環(huán)境惡劣的工業(yè)現(xiàn)場(chǎng),這種新型的微控制器的可靠性,安全性就成為了一個(gè)大的問題。在實(shí)驗(yàn)室運(yùn)行正常的程序到了工業(yè)現(xiàn)場(chǎng)卻不能運(yùn)行,或者出現(xiàn)運(yùn)行不穩(wěn)定經(jīng)常死機(jī)等。在這里我們主要討論一下如何通過軟件技術(shù)來增強(qiáng)系統(tǒng)的穩(wěn)定運(yùn)行。 當(dāng)系統(tǒng)的 CPU 部位受到干擾信號(hào)的作用時(shí),將使系統(tǒng)失控。最典型的故障是破壞程序計(jì)數(shù)器 PC 的狀態(tài)值。導(dǎo)致程序在地址空間內(nèi)“亂飛”,或者陷入死循環(huán)。而我們對(duì)這種情況的處理主要有這么幾種方法: 1、 指令冗余技術(shù); 2、 軟件陷阱技術(shù); 3、 看門狗技術(shù)。 我們以 MCS-51 單片機(jī)來做以說明。 一、指令冗余技術(shù) 我們知道,指令由操作碼和操作數(shù)組成,操作碼指明 CPU 要完成什么樣的操作,而操作數(shù)是操作碼的對(duì)象。單字節(jié)指令只有操作碼,隱含操作數(shù);雙字節(jié)指令,第一個(gè)字節(jié)是操作碼,第二個(gè)字節(jié)是操作數(shù);三字節(jié)指令第一個(gè)字節(jié)是操作碼,后二個(gè)字節(jié)是操作數(shù)。 CPU 在取指令的時(shí)候是先取操作碼再取操作數(shù),如何判斷是操作碼還是操作數(shù)就是通過取指令的順序。而取指令的順序完全由指令計(jì)數(shù)器 PC 來控制,因此,一旦 PC 受干擾出現(xiàn)錯(cuò)誤程序便會(huì)脫離正常軌道,出現(xiàn)“亂飛”,這樣就會(huì)使得把操作數(shù)當(dāng)作操作碼,或者把操作碼當(dāng)作操作數(shù)的情況。但只要 PC 指針落在單字節(jié)指令上程序就可納入正軌,所以為了快速的將程序納入正軌,我們應(yīng)該多用單字節(jié)指令,并在關(guān)鍵的地方人為的插入一些單字節(jié)指令 NOP ,或?qū)⒂行У膯巫止?jié)指令重寫,這就稱之為指令冗余。 常用的方法就是在一些雙字節(jié),三字節(jié)指令后面插入兩個(gè)單字節(jié)指令 NOP ,或在一些對(duì)程序的流向起決定作用的指令前面插入兩條 NOP 指令。還可對(duì)一些重要的指令進(jìn)行重復(fù)放置。 但采用指令冗余技術(shù)將程序納入正軌的條件是:亂飛的 PC 必須指向程序運(yùn)行區(qū)。 二、軟件陷阱技術(shù) 當(dāng)亂飛的程序進(jìn)入非程序區(qū)的時(shí)候, 我們就可設(shè)定軟件陷阱對(duì)亂飛的程序進(jìn)行攔截從而將程序引向一個(gè)固定的位置。這樣我們就可將捕獲的程序重新納入正軌。 軟件陷阱主要就是把程序從新引入它的復(fù)位入口處,也就是說我們?cè)谶m當(dāng)?shù)牡胤皆O(shè)置這樣的指令: NOP NOP LJMP 0000H 對(duì)于軟件陷阱的安排,我們主要安排在這樣一些區(qū)域,未使用的中斷區(qū),未使用的 EPROM 空間及非 EPROM 空間。程序運(yùn)行區(qū),及中斷服務(wù)程序區(qū)。在這里我們主要來看前三種: 1、 未使用的中斷區(qū) 如果對(duì)于未使用的中斷因干擾而開放的話,我們可以把中斷服務(wù)程序這樣來寫: NOP NOP POP D1 ;將原來的錯(cuò)誤斷點(diǎn)彈出 POP D2 ;將原來的錯(cuò)誤斷點(diǎn)彈出 PUSH 00H PUSH 00H ;將斷點(diǎn)地址重寫為 0000H RETI 2、 未使用的 EPROM 區(qū) 假設(shè)我們用了一片 2764 ,但并沒有用完整個(gè)存儲(chǔ)區(qū)。這時(shí)候就可在未用的區(qū)域里填充上 020000 數(shù)據(jù),這樣當(dāng)程序飛入其中時(shí)就會(huì)很快的走入正軌。這條指令其實(shí)是“ LJMP 0000H ”的機(jī)器碼。 3、 非 EPROM 空間 單片機(jī)系統(tǒng)的程序空間是 64K ,正常情況下我們所使用的 EPROM 不會(huì)占用所有的空間,假設(shè)我們現(xiàn)在的 EPROM 占用 16K 的空間那么剩下的 48K 空間就被閑置不用了。當(dāng)亂飛的 PC 落入這些空間時(shí),讀入的數(shù)據(jù)將為 FFH ,這是 : MOV R7 , A 指令的機(jī)器碼,將修改 R7 的內(nèi)容。因此,當(dāng)程序亂飛入非 EPROM 芯片區(qū)后,不僅無法導(dǎo)入正規(guī),面且破壞了 R7 的內(nèi)容。 我們知道,當(dāng) CPU 讀程序存儲(chǔ)器的時(shí)候,伴隨著會(huì)產(chǎn)生一個(gè) PSEN 信號(hào),我們就可利用這個(gè)信號(hào),再加上一個(gè)非 EPROM 區(qū)的地址譯碼信號(hào),構(gòu)成一個(gè)選通信號(hào)來起動(dòng)一個(gè)空閑的中斷,再用軟件陷井的方法從中斷程序中把程序?qū)胝?guī)。我們可看下面的一個(gè)圖: |