新聞中心

        EEPW首頁 > 嵌入式系統 > 兩種“軟件陷阱技術”的比較

        兩種“軟件陷阱技術”的比較

        ——
        作者:歐偉明 吳文君 時間:2007-11-19 來源:單片機及嵌入式系統應用 收藏

        引 言

            單片機應用系統的抗干擾具體可分為軟件和硬件兩方面,其中,軟件抗干擾以其設計靈活、節省硬件資源、降低成本等優勢越來越得到廣泛采用。軟件抗干擾技術主要有“指令冗余技術”、“”、“軟件看門狗技術”、“數字濾波技術”等。本文就對單片機應用系統抗干擾的原理與具體實現方法進行探討和研究,給出實現的兩種形式,并將該技術成功地使用在多個實際的單片機應用系統中,保證系統的可靠運行。

        1 程序跑飛和軟件陷阱技術概述

            程序正常運行時,程序計數器PC始終指向正在執行的這條指令的下一條指令的第一個字節的程序存儲器單元地址,這樣就保證了單片機能夠正確地讀取每一條指令的各個字節,即CPU先讀取操作碼,再讀取操作數(如果有操作數字節的話)。在MCS-51系列單片機中,程序計數器PC的尋址范圍是0000H~FFFFH,共64 KB。用戶應用程序中,根據系統要求,規定了程序運行的惟一路徑。這體現在系統上電后,程序計數器PC有唯一的變化歷程,保證了程序正常、有序地運行。程序跑飛是指系統受到某種干擾后,程序計數器PC的值偏離了給定的唯一變化歷程,導致程序運行偏離正常的運行路徑。程序跑飛因素及后果往往是不可預計的。

            在很多情況下,程序跑飛后系統會進入死循環而導致死機。這時,應采取有效措施引導跑飛的程序盡快退出死循環并迅速復位。實踐證明,軟件陷阱技術能有效引導跑飛的程序盡快退出死循環并迅速復位。

        2 兩種軟件陷阱技術的比較分析

            當單片機應用系統的CPU受到干擾時,不良影響的主要形式有:①非正常修改程序計數器PC指針;②改寫可編程輸出端口的狀態;③非正常修改重要數據區的數據。以上三個方面的不良影響會使單片機應用系統程序失控,控制狀態失靈,其后果是非常嚴重的,它甚至會使系統崩潰,造成嚴重的工業事故。以上幾個方面的不良影響可以使用軟件陷阱技術加以解決。現將這一技術的實現方法歸納總結為兩種。

        2.1 軟件陷阱技術實現形式之一


            單片機應用系統的用戶應用程序一般由循環結構的主程序和中斷服務子程序組成,主程序的結構如圖1所示。將下面的軟件陷阱程序段插入到用戶應用程序中(如何插入的問題將在下面的第3點中詳細討論),即在用戶應用程序存儲器不用區域寫入代碼“OO00020000H”。

            NOP
            NOP
            LJMP O000H

            當單片機應用系統工作正常時,單片機的CPU不會執行軟件陷阱程序段;但是,當單片機應用系統受到干擾而程序跑飛后,由于程序計數器PC值錯誤,破壞了正常的指令格式,導致執行非正常指令,從而執行軟件陷阱程序段,落入軟件陷阱,將跑飛的程序引導到復位入口地址0000H。軟件陷阱程序段中的連續2條NOP指令是為了增強“LJMP 0000H”被捕獲的能力,即“IJMP0000H”不會被沖散,當程序跑飛后會得到完整地執行,從而使跑飛的程序納入正常軌道。

        2.2 軟件陷阱技術實現形式之二


            雖然上述的軟件陷阱技術能實現可靠回復功能,但是有兩個方面的嚴重隱患。第一,隱患主要是在對中斷的處理上:首先,程序跑飛很可能是發生在中斷服務子程序中,其次,一些未使用的中斷很可能因為程序跑飛而被錯誤地激活,而這時只是簡單地讓跑飛的程序從頭開始運行,就不能關閉已激活的中斷,這樣,單片機的中斷系統會認為程序仍在處理中斷,就不會再響應同級中斷。第二,大部分單片機應用系統在上電復位初始化后,不希望在程序跑飛而用軟件陷阱回復后又重新初始化。

            為了解決第一個隱患,當程序跑飛時,一定要想辦法關閉可能發生的中斷,然后再執行用戶應用程序。大家知道,當CPU進入中斷后,就只能用RETI指令關閉中斷.解決第一個隱患的具體方法是,改變軟件陷阱程序段:當程序跑飛后,將跑飛的程序引到0202H處,然后在0202H處完成關閉中斷的工作,即在用戶應用程序存儲器不用區域寫入代碼“0000020202H”。需要注意的是,程序存儲器不用區域的最后兩個存儲單元,一定要分別寫入代碼“00H”。

            NOP
            NOP
            LJMP 0202H ;前面的連續2條NOP指令是為了  
                       ;增強“LJMP 0202H”被捕獲的能力
            而在0202H開始的程序存儲器單元進行如下的編程:
            ORG 0202H
            MOVDPTR,#ERRl
            PUSH DPL
            PUSH DPH
            RETI ;關閉第1級中斷,并跳轉到ERRl處
            ERRl: CLR A
            PUSH ACC
            PUSH ACC
            RETI ;關閉第2級中斷,軟件回復到0000H處

            這樣,就保證了無論在什么情況下,都可以關閉2級中斷。當然,如果沒有中斷被激活時運行了這段程序,也不會有什么不良影響。

            為了解決第二個隱患,可以在系統主程序入口處加一個軟件開關來判別是上電復位直接進入0000H的,還是經過軟件陷阱回復而進入0000H的,根據不同的判別結果執行不同的程序。

            單片機應用系統上電時,上電復位電路會使單片機處于復位狀態。這一般稱為冷啟動。

            但是,軟件陷阱技術使跑飛的程序回復到主程序入口地址0000H時,不影響特殊功能寄存器SFR的有效位。解決第二個隱患的具體方法是,設置上電復位標志。例如,以PSW.5作為上電標志位,當PSW.5=0時,表示是上電復位;當PSW.5=l時,表示是軟件陷阱回復。圖2是上電復位與程序跑飛后軟件陷阱回復初始化處理框圖。0000H是MCU的復位入口,程序啟動后,首先判斷是上電復位,還是程序跑飛后軟件陷阱回復。上電復位是開機操作,要建立上電標志,并進行系統的完全初始化。程序跑飛后軟件陷阱回復應該進行相關資源的檢查與修復,以防止系統運行出錯。另外,根據系統特點,需要保留一些過程數據,不得進行完全初始化。

            為了解決上述兩個隱患,有如下具體編程。其中,START0為系統上電復位完全初始化于程序入口,ER-ROR為程序跑飛后軟件陷阱回復應進行的系統部分初始化和相關資源的檢查與修復程序入口,LOOP是用戶應用程序功能模塊入口。

            ORG0000H
            LJMP START
            ORG 0100H
            START: MOV C,PSW.5
            JC ERROR
            SETB C
            MOV PSW.5,C
            LCALL STARTO
            LJMP LOOP
            ERROR: ……
            L00P: …… ;應用程序功能模塊
            LJMP LOOP
            ORG 0200H
            NOP
            NOP
            MOV DPTR,#ERRl
            PUSH DPL
            PUSH DPH
            RETl ;關閉第1級中斷,并跳轉到ERRl處
            CRRl: CLR A
            PUSH ACC
            PUSH ACC
            RETI ;關閉第2級中斷,軟件回復到0000H處

        3 軟件陷阱在用戶應用程序中的安排位置

            軟件陷阱程序段可以插入到主程序中或者中斷服務子程序中。根據實際應用情況,對軟件陷阱程序段的位置安排可以有5種方式。

        (1)在主程序的應用功能模塊之間


            在單片機應用系統程序設計時,將軟件陷阱程序段分散地放在各應用功能模塊之間空余的程序存儲器單元里。當用戶應用程序正常運行時,這些軟件陷阱程序段并不會執行,但是,當單片機應用系統的CPU受干擾而使程序失控時,程序計數器PC指針一旦落入這些陷阱區,就可以馬上將跑飛的程序拉回到正確的軌道。這種方法的確很有效。軟件陷阱的多少一般依據用戶應用程序大小而定,一般1KB的用戶應用程序有2~3個軟件陷阱就可以了,具體方法如下:

            應用功能模塊1
            軟件陷阱程序段
            應用功能模塊2
            軟件陷阱程序段

        (2)在閑置未使用的EPROM/Flash ROM空間

           
        在閑置未使用的EPROM/Flash ROM空間設置軟件陷阱,即在這些閑置未使用的EPROM/Flash ROM空間寫滿代碼“0000020202H”。值得注意的是,最后兩個存儲單元一定要分別寫入代碼“OOH”。當程序跑飛而進入此區后,便會被軟件陷阱迅速拉回正常軌道。

        (3)在中斷服務子程序中


            軟件看門狗(soltware watchdog)實際上是軟件陷阱的一個應用實例。以MCS-5l系列單片機為例,在系統初始化時將MCU內部的定時器/計數器T0設置為定時器,并將TO定時溢出中斷設置為高級中斷.如果系統采用6 MHz時鐘,可以用如下的初始化程序段使TO定時約130 ms來形成軟件看門狗:

            MOV TMOD, #01H ;將T0設置為16位定時器
            SETB ETO ;允許TO中斷
            SETB PTO ;將TO定時溢出中斷設置為高級中斷
            MOV TH0,#0;給TO賦初值,定時約130/ms
            MOV TLO,#0
            SETB TR0 ;啟動T0開始定時
            SETB EA ;允許CPU中斷
            另外,TO定時溢出中斷服務子程序編程如下:
            INTO-PRo; MOV A,#02H
            PUSH ACC
            PUSH ACC
            RET1 ;中斷返回到0202H單元

            當用戶應用程序運行正常時,在小于130 ms的時間內,CPU應該及時“喂狗”一一執行清狗指令“MOV THO,#0”和“MOV TLO,#0”。這樣,TO就不會產生定時溢出,從而T0定時溢出中斷服務子程序不會被執行。但是,當單片機應用系統的CPU受干擾而使程序失控時,CPU就不會及時執行清狗指令,以致于產生TO定時溢出中斷,就可以馬上將跑飛的程序拉回到正確的軌道。實現及時“喂狗”的具體方法是在用戶應用程序中的適當位置插入指令“MOV TH0,#0”和“MOV TLO,#O”。實際上,TO定時溢出中斷服務子程序就是一個軟件陷阱,一旦執行T0定時溢出中斷服務子程序,就是把跑飛的程序強行拉回到0202H程序存儲器單元。由前面的分析可知,已經跑飛的程序可以迅速地被納入正確的軌道。

        (4)在未使用的程序存儲器地址空間


            對MCS-51系列單片機而言,程序計數器PC的尋址范圍是0000H~FFFFH,共64 KB;然而,在實際的單片機應用系統中,一般沒有使用到64 KB的程序存儲器,這樣就會余下大量的程序存儲器地址空間。例如,系統中僅選用了1片2764作為程序存儲器,其地址空間為8 KB。那么將有56 KB程序存儲器地址空間被閑置。當CPU受到干擾而使程序計數器PC指向這些被閑置的程序存儲器地址空間時,CPU取指令得到的指令代碼為“0FFH”(這個結論可以根據圖3所示電路分析后得出)。該代碼是“MOV R7,A”指令的機器碼。顯而易見,當單片機應用系統的CPU受干擾而使程序失控時,程序計數器PC指針一旦落入這些被閑置的程序存儲器地址空間時,CPU執行該指令不僅將錯誤地修改寄存器R7的內容,而且無法將跑飛的程序納入正確的軌道。可以使用下面的軟件陷阱技術解決這個問題。

            如圖3所示,EPROM芯片2764的地址空間為0000H~lFFFH,譯碼器74LSl38的輸出Y0為其片選信號,2000H~FFFFH為未使用的程序存儲器空間。當程序計數器PC的值落入2000H~FFFFH空間時,一定有Y0為高電乎;當取指令操作時,PSEN為低電平,則74LS244的選通信號有效,所以74LS244被選中。進一步分析圖3所示電路可知,當用戶應用程序失控而程序計數器PC指向被閑置的程序存儲器地址空間2000H~FFFFH時,總線驅動器74LS244被選通,這時CPU通過總線讀入的指令機器碼為020202H,正好是一條轉移指令“LJMP0202H”,這樣,使程序計數器PC指向0202H程序存儲器單元。由前面的分析可知,已經跑飛的程序可以迅速地被納入正確的軌道。

        (5) 對外部RAM寫操作實旆監控保護而設置軟件陷阱

            在單片機應用系統的外部數據存儲器RAM中,一般保存了大量的預置數據和程序運行時產生的中間數據。外部數據存儲器RAM的寫入是由“MOVX@DPTR,A”指令來完成的。當CPU受干擾程序跑飛而誤執行了該指令時,就會改寫RAM中內容,導致RAM中的重要數據丟失。為了減小這種RAM中數據丟失的可能性,應在外部RAM寫操作之前,對寫操作進行條件判斷。如果條件滿足才執行寫入操作;如果條件不滿足,則將寫入操作屏蔽,并使程序落入陷阱,進入死循環。在程序落人死循環陷阱后,便只能由其他軟、硬件抗干擾技術(如看門狗技術)使系統退出死循環陷阱,從而使系統恢復正常。具體源程序代碼如下(不妨設要寫入外部RAM的內容存放在累加器A中,要寫入數據的外部RAM單元地址存放在DPTR中):

            MOV 6EH, #55H
            MOV 6FH, #OAAH
            LCALL WRlTE
            RET
            WRITE:NOP
            CINE 6EH,#55H,TRAP
            ;寫入條件是(6EH)=#55H
            CJNE 6FH,#OAAH,TRAP且(6FH)=#OAAH
            MOVX @DPTR,A
            NOP
            M0V 6EH,#00H
            M0V 6FH,#OOH
            RET
            TRAP, SJMP TRAP ;落入死循環陷阱

        4 結 論

            與第1種形式的軟件陷阱技術比較,第2種形式的軟件陷阱技術消除了兩個嚴重的隱患,因此,第2種形式的軟件陷阱技術是一種有效實用的單片機應用系統抗干擾技術。本文所介紹的軟件陷阱技術已成功地使用在多個實際的單片機應用系統中,保證了系統的可靠運行。

        存儲器相關文章:存儲器原理


        塵埃粒子計數器相關文章:塵埃粒子計數器原理


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丁青县| 长宁区| 威海市| 突泉县| 赫章县| 雷州市| 兴海县| 卓资县| 咸丰县| 阿图什市| 于都县| 永寿县| 两当县| 西乌珠穆沁旗| 四平市| 鹤岗市| 余干县| 嘉禾县| 麻栗坡县| 高台县| 浦县| 舒城县| 太仆寺旗| 紫云| 札达县| 梓潼县| 兴和县| 深水埗区| 沐川县| 吕梁市| 平安县| 海宁市| 那曲县| 衡水市| 巴东县| 德庆县| 铜川市| 彝良县| 出国| 连山| 泸州市|