基于MCS-96單片機控制系統的程序失控防范
1 引言
本文引用地址:http://dyxdggzs.com/article/172098.htm單片機構成控制系統時(shí),在滿(mǎn)足了各項控制功能后,為了使系統投入實(shí)用,必須提高其可靠性。但是,由于工業(yè)現場(chǎng)環(huán)境惡劣,常會(huì )受到電磁設備啟動(dòng)、停止、電源波形畸變等因素的影響,各種干擾不可避免,若只靠避錯設計很難滿(mǎn)足要求,而且也很難確保這些硬件萬(wàn)無(wú)一失,必須為系統配備容錯功能。所以,抗干擾設計、容錯設計(包括故障檢測與診斷技術(shù))和功能設計成為單片機系統設計缺一不可的重要內容。
在工業(yè)現場(chǎng),大多數情況下干擾不會(huì )造成單片機系統硬件的損壞,主要是對軟件運行造成不良影響。其主要特征是:指令碼或數字碼受干擾,使程序的執行出現錯誤。最典型的錯誤有:1)CPU的程序計數器PC的值發(fā)生跳變,使程序跑飛,轉去執行一個(gè)毫無(wú)意義或錯誤的程序段,使系統出現混亂或失控,嚴重時(shí)可能會(huì )造成設備損壞,甚至危及人身安全;2)輸出口被失控程序非法操作,使控制量發(fā)生波動(dòng)或使系統出現“死機”;3)RAM區域受干擾,造成數據被沖毀,使系統出現運行不正常,輸出出錯。下面以MCS-96系列單片機所組成的實(shí)時(shí)控制系統為例,提出一些有效、實(shí)用的程序失控防范措施。
2 捕捉跑飛程序的方法
2.1 指令冗余
單片機最易受干擾的是內部程序計數器——PC的值。在受到強干擾時(shí),PC的值被改變,改變后的值是隨機的不確定值。這可使CPU將程序從正確的位置跑飛到ROM中的任何一個(gè)地址,當PC值飛到用戶(hù)工作程序ROM區內時(shí),可采用指令冗余的方法使程序走上正軌。具體方法是:1)在一些對程序流向起決定性作用的指令,如SJMP、 LJMP、LCALL、CALL等之前插入幾條NOP指令;2)在某些對系統工作至關(guān)重要的指令,如中斷、堆棧等之前插入幾條NOP指令;3)在程序中每隔若干條指令,插入一條NOP指令;4)在多字節指令前插入一條或兩條NOP指令。
由于單片機指令大多數為單字節指令,在一個(gè)程序中,其中斷和堆棧指令使用的次數也很有限,因此,采用這種方法增加存儲單元的數量不會(huì )太多。區,如EPROM中未被使用的空間或程序中的數據表格區時(shí),常采用軟件陷阱的方法來(lái)使程序納入正軌。
所謂軟件陷阱,就是一條引導指令,利用這條指令強行將程序引向一個(gè)指定的地址,在指定的地址上有一個(gè)專(zhuān)門(mén)的出錯處理程序。假設該程序的入口標號為EPROM,則軟件陷阱由以下3條指令構成:
NOP
NOP
LJMP ERROR
該軟件陷阱除了安裝在未使用的用戶(hù)EPROM區外,還常常安置在未使用的中斷向量區、表格區的最后和程序的斷裂點(diǎn)后(斷裂點(diǎn)是指象LJMP、SJMP、RET等類(lèi)指令)。
2.3 看門(mén)狗(WATCHDOGTIMER)
當跑飛的程序既沒(méi)有落入軟件陷阱,又沒(méi)有遇到冗余指令,而是在用戶(hù)程序之間或用戶(hù)根本未使用的地址空間內跳來(lái)跳去,自動(dòng)形成一個(gè)死循環(huán),解決這一問(wèn)題的辦法是利用軟件啟動(dòng)單片機的監視定時(shí)器,俗稱(chēng)“看門(mén)狗”。當出現上述情況時(shí),利用它來(lái)使系統復位。這種方法簡(jiǎn)單、直觀(guān),只需不超過(guò)64K狀態(tài)周期(16ms)的時(shí)間(用12M晶振時(shí)),計算機就可恢復正常。但此時(shí),一定要通過(guò)軟件每隔一定時(shí)間(如15ms)使WATCHDOG TIMER復位一次。
3 無(wú)擾動(dòng)重恢復
上述各項措施,只解決了如何發(fā)現系統被干擾和如何捕捉到失控的程序,這對于巡回檢測、顯示之類(lèi)的普通單片機應用系統已經(jīng)足夠了。但是,在一些關(guān)鍵的工業(yè)控制系統中,由于工作過(guò)程和生產(chǎn)工藝的邏輯性和順序性,當程序失控后,希望引導系統恢復執行剛才失控發(fā)生時(shí)的那個(gè)程序模塊,不希望,甚至不允許程序從入口處重新執行。更重要的是,失控程序往往會(huì )亂涂亂寫(xiě),不僅會(huì )破壞一些重要的信息,而且會(huì )對輸出口進(jìn)行非法操作。在此情況下前述方法就顯得太不完整了。因此,如何恢復系統的重要信息,盡量無(wú)擾動(dòng)地重新進(jìn)入正常工作狀態(tài),是一個(gè)必須解決的問(wèn)題,同時(shí)也是一個(gè)比較難解決的問(wèn)題。
3.1 利用軟件選擇啟動(dòng)方式的方法
復位有兩種方式:即初始復位和再次復位。習慣上稱(chēng)前者為“冷啟動(dòng)”,后者為“熱啟動(dòng)”。“冷啟動(dòng)”時(shí),系統的狀態(tài)全部無(wú)效,需進(jìn)行徹底的初始化操作。而 “熱啟動(dòng)”僅對系統的當前狀態(tài)進(jìn)行修復和有選擇的初始化,從而使系統盡可能快的恢復正常。系統初次上電投入運行時(shí),必須是“冷啟動(dòng)”。運行過(guò)程中,由于抗干擾措施引起的復位,一般均為“熱啟動(dòng)”。為了使系統能正確地決定采用何種啟動(dòng)方式,往往由軟件用“上電標志”來(lái)區分。系統入口程序設計策略如圖3—1 所示。
為使“熱啟動(dòng)”順利進(jìn)行,首先要關(guān)中斷,重新設置堆棧,將所有的I/O口設置為安全狀態(tài),封鎖I/O操作,以免事態(tài)擴大,然后進(jìn)行信息的恢復和狀態(tài)的重入工作。
3.2 使受擾程序快速重入正常運行狀態(tài)的方法
系統軟件是由完成各種功能的程序組成的,因此可分成若干個(gè)功能模塊。為了能使程序快速重入系統的正常運行狀態(tài),首先要將系統軟件編制成模塊化結構,并盡可能的將其細分為若干功能模塊,每個(gè)功能模塊在運行中需具有寫(xiě)入和記錄功能,即設置RAM區的有效標志;記錄編號和首地址;記錄關(guān)鍵的又不可重新獲得的數據;模塊還應具有給運行監視系統發(fā)脈沖的功能等。為判斷程序是否跑飛,要求在每個(gè)功能模塊的結尾處將指定單元中保存的標志與本功能模塊預先設置的標志進(jìn)行對比。若不同,則程序跑飛,然后將它恢復到指定單元中保存的標志所對應的功能模塊去重新執行;若相同,則運行正常。對于功能模塊中的程序跑飛,可根據具體情況對結果的合理性進(jìn)行分析和判斷。若不合理,則返回重新執行;若合理,則進(jìn)入下一個(gè)功能模塊。具有這種功能的程序流程圖如圖3—2所示。
評論