<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

——
作者: 時(shí)間:2007-11-19 來(lái)源:?jiǎn)纹瑱C及嵌入式系統應用 收藏
       引 言

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

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

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

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

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

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

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

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

 

    NOP
    NOP
    LJMP O000H {{分頁(yè)}}

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

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

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

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

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

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

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

       單片機應用系統上電時(shí),上電復位電路會(huì )使單片機處于復位狀態(tài)。這一般稱(chēng)為冷啟動(dòng)。

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

   {{分頁(yè)}}

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

    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 ;關(guān)閉第1級中斷,并跳轉到ERRl處
    CRRl: CLR A
    PUSH ACC
    PUSH ACC
    RETI ;關(guān)閉第2級中斷,軟件回復到0000H處

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

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

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

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

     
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>