<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于MCS-96單片機控制系統(tǒng)的程序失控防范

          基于MCS-96單片機控制系統(tǒng)的程序失控防范

          作者: 時間:2012-02-15 來源:網(wǎng)絡(luò) 收藏

          1 引言

          本文引用地址:http://www.ex-cimer.com/article/172098.htm

          構(gòu)成時,在滿足了各項控制功能后,為了使系統(tǒng)投入實用,必須提高其可靠性。但是,由于工業(yè)現(xiàn)場環(huán)境惡劣,常會受到電磁設(shè)備啟動、停止、電源波形畸變等因素的影響,各種干擾不可避免,若只靠避錯設(shè)計很難滿足要求,而且也很難確保這些硬件萬無一失,必須為系統(tǒng)配備容錯功能。所以,抗干擾設(shè)計、容錯設(shè)計(包括故障檢測與診斷技術(shù))和功能設(shè)計成為系統(tǒng)設(shè)計缺一不可的重要內(nèi)容。

          在工業(yè)現(xiàn)場,大多數(shù)情況下干擾不會造成系統(tǒng)硬件的損壞,主要是對軟件運行造成不良影響。其主要特征是:指令碼或數(shù)字碼受干擾,使的執(zhí)行出現(xiàn)錯誤。最典型的錯誤有:1)CPU的計數(shù)器PC的值發(fā)生跳變,使跑飛,轉(zhuǎn)去執(zhí)行一個毫無意義或錯誤的程序段,使系統(tǒng)出現(xiàn)混亂或,嚴重時可能會造成設(shè)備損壞,甚至危及人身安全;2)輸出口被程序非法操作,使控制量發(fā)生波動或使系統(tǒng)出現(xiàn)“死機”;3)RAM區(qū)域受干擾,造成數(shù)據(jù)被沖毀,使系統(tǒng)出現(xiàn)運行不正常,輸出出錯。下面以-96系列單片機所組成的實時為例,提出一些有效、實用的程序措施。

          2 捕捉跑飛程序的方法

          2.1 指令冗余

          單片機最易受干擾的是內(nèi)部程序計數(shù)器——PC的值。在受到強干擾時,PC的值被改變,改變后的值是隨機的不確定值。這可使CPU將程序從正確的位置跑飛到ROM中的任何一個地址,當(dāng)PC值飛到用戶工作程序ROM區(qū)內(nèi)時,可采用指令冗余的方法使程序走上正軌。具體方法是:1)在一些對程序流向起決定性作用的指令,如SJMP、 LJMP、LCALL、CALL等之前插入幾條NOP指令;2)在某些對系統(tǒng)工作至關(guān)重要的指令,如中斷、堆棧等之前插入幾條NOP指令;3)在程序中每隔若干條指令,插入一條NOP指令;4)在多字節(jié)指令前插入一條或兩條NOP指令。

          由于單片機指令大多數(shù)為單字節(jié)指令,在一個程序中,其中斷和堆棧指令使用的次數(shù)也很有限,因此,采用這種方法增加存儲單元的數(shù)量不會太多。區(qū),如EPROM中未被使用的空間或程序中的數(shù)據(jù)表格區(qū)時,常采用軟件陷阱的方法來使程序納入正軌。

          所謂軟件陷阱,就是一條引導(dǎo)指令,利用這條指令強行將程序引向一個指定的地址,在指定的地址上有一個專門的出錯處理程序。假設(shè)該程序的入口標(biāo)號為EPROM,則軟件陷阱由以下3條指令構(gòu)成:
            NOP
            NOP
            LJMP  ERROR

          該軟件陷阱除了安裝在未使用的用戶EPROM區(qū)外,還常常安置在未使用的中斷向量區(qū)、表格區(qū)的最后和程序的斷裂點后(斷裂點是指象LJMP、SJMP、RET等類指令)。

          2.3 看門狗(WATCHDOGTIMER)

          當(dāng)跑飛的程序既沒有落入軟件陷阱,又沒有遇到冗余指令,而是在用戶程序之間或用戶根本未使用的地址空間內(nèi)跳來跳去,自動形成一個死循環(huán),解決這一問題的辦法是利用軟件啟動單片機的監(jiān)視定時器,俗稱“看門狗”。當(dāng)出現(xiàn)上述情況時,利用它來使系統(tǒng)復(fù)位。這種方法簡單、直觀,只需不超過64K狀態(tài)周期(16ms)的時間(用12M晶振時),計算機就可恢復(fù)正常。但此時,一定要通過軟件每隔一定時間(如15ms)使WATCHDOG TIMER復(fù)位一次。

          3 無擾動重恢復(fù)

          上述各項措施,只解決了如何發(fā)現(xiàn)系統(tǒng)被干擾和如何捕捉到失控的程序,這對于巡回檢測、顯示之類的普通單片機應(yīng)用系統(tǒng)已經(jīng)足夠了。但是,在一些關(guān)鍵的工業(yè)中,由于工作過程和生產(chǎn)工藝的邏輯性和順序性,當(dāng)程序失控后,希望引導(dǎo)系統(tǒng)恢復(fù)執(zhí)行剛才失控發(fā)生時的那個程序模塊,不希望,甚至不允許程序從入口處重新執(zhí)行。更重要的是,失控程序往往會亂涂亂寫,不僅會破壞一些重要的信息,而且會對輸出口進行非法操作。在此情況下前述方法就顯得太不完整了。因此,如何恢復(fù)系統(tǒng)的重要信息,盡量無擾動地重新進入正常工作狀態(tài),是一個必須解決的問題,同時也是一個比較難解決的問題。

          3.1 利用軟件選擇啟動方式的方法

          復(fù)位有兩種方式:即初始復(fù)位和再次復(fù)位。習(xí)慣上稱前者為“冷啟動”,后者為“熱啟動”。“冷啟動”時,系統(tǒng)的狀態(tài)全部無效,需進行徹底的初始化操作。而 “熱啟動”僅對系統(tǒng)的當(dāng)前狀態(tài)進行修復(fù)和有選擇的初始化,從而使系統(tǒng)盡可能快的恢復(fù)正常。系統(tǒng)初次上電投入運行時,必須是“冷啟動”。運行過程中,由于抗干擾措施引起的復(fù)位,一般均為“熱啟動”。為了使系統(tǒng)能正確地決定采用何種啟動方式,往往由軟件用“上電標(biāo)志”來區(qū)分。系統(tǒng)入口程序設(shè)計策略如圖3—1 所示。

          46.jpg

          為使“熱啟動”順利進行,首先要關(guān)中斷,重新設(shè)置堆棧,將所有的I/O口設(shè)置為安全狀態(tài),封鎖I/O操作,以免事態(tài)擴大,然后進行信息的恢復(fù)和狀態(tài)的重入工作。

          47.jpg

          3.2 使受擾程序快速重入正常運行狀態(tài)的方法

          系統(tǒng)軟件是由完成各種功能的程序組成的,因此可分成若干個功能模塊。為了能使程序快速重入系統(tǒng)的正常運行狀態(tài),首先要將系統(tǒng)軟件編制成模塊化結(jié)構(gòu),并盡可能的將其細分為若干功能模塊,每個功能模塊在運行中需具有寫入和記錄功能,即設(shè)置RAM區(qū)的有效標(biāo)志;記錄編號和首地址;記錄關(guān)鍵的又不可重新獲得的數(shù)據(jù);模塊還應(yīng)具有給運行監(jiān)視系統(tǒng)發(fā)脈沖的功能等。為判斷程序是否跑飛,要求在每個功能模塊的結(jié)尾處將指定單元中保存的標(biāo)志與本功能模塊預(yù)先設(shè)置的標(biāo)志進行對比。若不同,則程序跑飛,然后將它恢復(fù)到指定單元中保存的標(biāo)志所對應(yīng)的功能模塊去重新執(zhí)行;若相同,則運行正常。對于功能模塊中的程序跑飛,可根據(jù)具體情況對結(jié)果的合理性進行分析和判斷。若不合理,則返回重新執(zhí)行;若合理,則進入下一個功能模塊。具有這種功能的程序流程圖如圖3—2所示。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();