隨著單片機在能源領(lǐng)域中的廣泛應用,單片機的抗干擾問題越來越突出,煤礦井下環(huán)境一般比較惡劣,這便會為單片機控制系統(tǒng)帶來各種干擾,以致系統(tǒng)不能正常工作。單片機應用系統(tǒng)的抗干擾性能主要取決于硬件的抗干擾設計,但軟件抗干擾設計作為硬件抗干擾的完善和補充,作用也非常重要,因為大量的干擾通常并不能影響系統(tǒng)內(nèi)硬件的運作,卻常會使系統(tǒng)的軟件無法正常運行,單片機應用的一個突出問題,便是單片機運行過程中經(jīng)常出現(xiàn)的程序跑飛現(xiàn)象。
在單片機系統(tǒng)中,因為干擾的原因,在非預期的情況下,使得程序計數(shù)器PC 的值發(fā)生隨機的變化,從而使得程序的流向指向不確定區(qū)域,這便是程序的跑飛。程序跑飛后或者會使指令的地址碼和操作碼發(fā)生改變,PC 把操作數(shù)當作指令來執(zhí)行;或者PC值指向一條不合邏輯關(guān)系的指令甚或是非程序區(qū),運行結(jié)果常常會使單片機進入死循環(huán)———便是大家常說的“死機”。為確保在無人當值的情況下,單片機“死機”后能自動恢復過來,通常采用軟件陷阱,外部WDT 電路,以及軟件控制的WATCHDOG 等方法,使系統(tǒng)恢復正常(后兩種俗稱“看門狗”),限于篇幅不做專門說明,這里主要向大家介紹用555 定時器軟硬結(jié)合做看門狗的一種方法。
在編寫單片機程序的時候,由于中斷服務程序?qū)懙牟缓?,導致單片機程序總是跑飛,最后費了好長時間,花了很大功夫才找到問題原因,由此總結(jié)了單片機程序跑飛的三種現(xiàn)象、原因及解決方法。
1 數(shù)組越界/溢出
現(xiàn)象:
單片機程序在函數(shù)中運行時,總是在運行到函數(shù)末尾,要跳出函數(shù)時,程序跑飛。
原因:
數(shù)組越界(數(shù)組溢出),函數(shù)中定義的數(shù)組元素的個數(shù)小于程序中實際使用的數(shù)組元素的個數(shù),例如在函數(shù)中定義了一個數(shù)組ucDataBuff[10],這個數(shù)組只有10個元素,但是在函數(shù)中卻有這樣的語句ucDataBuff[10]=0x1a,這個語句是給數(shù)組的第11個元素賦值,:由于定義的數(shù)組只有10個元素,從而導致賦值語句中不知道把0x1a放到什么地方,從而導致程序跑飛。
解決方法:
如果在調(diào)試程序時,發(fā)現(xiàn)程序總是在函數(shù)執(zhí)行完畢時跑飛,多數(shù)情況是發(fā)生了數(shù)組越界(數(shù)組溢出)的錯誤,仔細檢查函數(shù)中調(diào)用的數(shù)組是否存在越界(溢出)的情況。
2 中斷服務程序缺失
現(xiàn)象:
程序運行過程中總是跑飛。
原因:
程序中打開了某個中斷,但是卻沒有相應的中斷服務程序,從而導致在中斷發(fā)生后,找不到中斷服務程序入口,從而導致程序跑飛。
解決方法:
檢查程序中是否存在打開了某個中斷,但是沒有相對應的中斷服務程序。
3 看門狗復位
現(xiàn)象:
在執(zhí)行一段較為耗費時間的程序時,程序跑飛,并且總是跳到復位位置處。
原因:
程序中使用了看門狗,但是沒有及時“喂狗”,從而導致看門狗復位,使程序直接跳到復位位置。
解決方法:
根據(jù)程序運行時間,尤其是一定要計算清楚最耗時的那段程序的運行時間,然后準確設置看門狗的復位時長,定時“喂狗”,尤其是如果有死循環(huán)的情況,一定要在死循環(huán)中記得“喂狗”。