新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 學習方法與實踐 > 兩種“軟件陷阱技術(shù)”的比較

        兩種“軟件陷阱技術(shù)”的比較

        ——
        作者: 時間:2007-11-19 來源:單片機及嵌入式系統(tǒng)應(yīng)用 收藏
               引 言

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

               1 程序跑飛和軟件陷阱技術(shù)概述

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

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

               2 兩種軟件陷阱技術(shù)的比較分析

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

                2.1 軟件陷阱技術(shù)實現(xiàn)形式之一

                單片機應(yīng)用系統(tǒng)的用戶應(yīng)用程序一般由循環(huán)結(jié)構(gòu)的主程序和中斷服務(wù)子程序組成,主程序的結(jié)構(gòu)如圖1所示。將下面的軟件陷阱程序段插入到用戶應(yīng)用程序中(如何插入的問題將在下面的第3點中詳細討論),即在用戶應(yīng)用程序存儲器不用區(qū)域?qū)懭氪a“OO00020000H”。 

         

            NOP
            NOP
            LJMP O000H {{分頁}}

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

                2.2 軟件陷阱技術(shù)實現(xiàn)形式之二

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

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

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

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

               為了解決第二個隱患,可以在系統(tǒng)主程序入口處加一個軟件開關(guān)來判別是上電復(fù)位直接進入0000H的,還是經(jīng)過軟件陷阱回復(fù)而進入0000H的,根據(jù)不同的判別結(jié)果執(zhí)行不同的程序。 

               單片機應(yīng)用系統(tǒng)上電時,上電復(fù)位電路會使單片機處于復(fù)位狀態(tài)。這一般稱為冷啟動。

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

           {{分頁}}

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

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

              3 軟件陷阱在用戶應(yīng)用程序中的安排位置

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

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

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

             
        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 长兴县| 龙井市| 浪卡子县| 蓬安县| 茂名市| 娄烦县| 广南县| 宁晋县| 会泽县| 隆化县| 洪湖市| 沁阳市| 清新县| 团风县| 上林县| 舞钢市| 宁国市| 新绛县| 卢龙县| 延长县| 琼海市| 金门县| 磴口县| 峨眉山市| 湘乡市| 兰西县| 德钦县| 德兴市| 西吉县| 霞浦县| 息烽县| 睢宁县| 宾阳县| 徐州市| 汕头市| 靖远县| 准格尔旗| 阳谷县| 汝阳县| 乐昌市| 台江县|