有時,在寫ARM時會遇到經常死機的情況,莫名其妙,在這里我總結了一些單片機/ARM死機或者跑飛的一些常見的查找方法和我對此的一些拙見希望對大家有幫助。 “死機”和“跑飛” 隨著單片機在能源領域中的廣泛應用,單片機的抗干擾問題越來越突出,煤礦井下環境一般比較惡劣,這便會為單片機控制系統帶來各種干擾,以致系統不能正常工作。單片機應用系統的抗干擾性能主要取決于硬件的抗干擾設計,但軟件抗干擾設計作為硬件抗干擾的完善和補充,作用也非常重要,因為大量的干擾通常并不能影響系統內硬件的運作,卻常會使系統的軟件無法正常運行,單片機應用的一個突出問題,便是單片機運行過程中經常出現的程序跑飛現象。 在單片機系統中,因為干擾的原因,在非預期的情況下,使得程序計數器PC 的值發生隨機的變化,從而使得程序的流向指向不確定區域,這便是程序的跑飛。程序跑飛后或者會使指令的地址碼和操作碼發生改變,PC 把操作數當作指令來執行;或者PC值指向一條不合邏輯關系的指令甚或是非程序區,運行結果常常會使單片機進入死循環———便是大家常說的“死機”。為確保在無人當值的情況下,單片機“死機”后能自動恢復過來,通常采用軟件陷阱,外部WDT 電路,以及軟件控制的WATCHDOG 等方法,使系統恢復正常(后兩種俗稱“看門狗”)。 出錯原因分析 那在程序運行出現這些錯誤時,我們要從哪些方面進行分析呢? 1、意外中斷。 確認下是否打開了某個中斷,但是沒有響應和**中端標志,導致程序一直進入中斷,造成死機假象。 2、 中斷變量處理不妥。 若定義某些會在中斷中修改的全局變量,這時要注意兩個問題:首先為了防止編譯器優化中斷變量,要在這些變量定義時前加 volatile,其次在主循環中讀取中斷變量前應該首先關閉全局中斷,防止讀到一半被中斷給修改了,讀完之后再打開全局中斷;否則出現造成數據亂套。 3、地址溢出,常見錯誤為指針操作錯誤。 我要著重說的是數組下標使用循環函數中循環變量,如果循環變量沒控制好則會出現數組下標越界,意外修改系統的寄存器造成死機,這種情況下如果死機說明運氣好,否則后面不知道發生什么頭疼的事。 4、 無條件的死循環。 比如使用while(x);等待電平變化,正常情況下x都會變成0,就怕萬一,因此最好加上時間限制; 5、看門狗沒有關閉。 有的單片機即使沒使用看門狗開機時也有可能意外自動開啟了最小周期的看門狗,導致軟件不斷復位,造成死機,這個要看芯片手冊,最好在程序復位后首先應該顯式**看門狗再關閉看門狗; 6、 堆棧溢出。 最難查找的問題,對于容量小的單片機,盡量減少函數調用層級,減少局部變量,從而減少壓棧的時候所需的空間。當你把以上幾條都試過不能解決問 題,試一試把你的被調用少函數直接內置到調用的地方并且把占用RAM大的局部變量改成全局變量,試一試說不定就可以了。 處理方法 找出原因后,我們要怎么處理呢? 死機是指CPU的程序指針進入一個死循環,無法執行正常的程序流程。其外在表現常常是:正常功能喪失,按鍵無響應,顯示凝固。單片機死機后,只有復全才能走出死循環,執行正常的程序流程。眾所屬知,克服死機的最有效手段是加看門狗(WatchDog)。 目前用得最廣泛的看門狗實際上是一個特殊的定時器DogTimer。DogTimer按固定速率計時,計滿預定時間就發出溢出脈沖使單片機復位。如果每次在DogTimer溢出前強行讓DogTimer清零,就不會發出溢出脈沖。清零脈沖由CPU發出,在單片機程序中每隔一段語句放一個清DogTimer的語句——FeedDog語句,以保證程序正常運行時DogTimer不會溢出。一旦程序進入一個不含FeedDog語句的死循環,DogTimer將溢出,導致單片機復位,跳出這個死循環。本文稱這種看門狗為典型看門狗,典型看門狗已被集成比,如MAX706、MAX791等[1];還有許多單片機本身集成了這種看門狗,如PIC16C57、MC68HC705等, 有一個錯誤觀點:加了看門狗,單片機就不會死機。實際上,看門狗有時間會完全失效。當程序進入某個死循環,而這個死循環中又包含FeedDog語句,這時DogTimer始終不會溢出,單片機始終得不到復位信號,程序也就始終跳不出這個死循環。針對這一弊端,筆者設計了雙對限看門狗和定時復位看門狗。 雙時限看門狗有兩個定時器;一個為短定時器,一個為長定時器。短定時器定時為T1,長定時器定時為T2,0 。這樣,當程序進入某個死循環,如果這個死循環包含短定時器FeedDog語句而不包含長定時器FeedDog語句,那么長定時順終將溢出,使單片機復位。巧妙安排長定時器FeedDog語句的位置,可保證出現死機的概率根低。 目前幾乎所有的看門狗都是依賴于CPU(依賴于CPU FeedDog)。這可以比作:一個保險設備能否起到保險作用還依賴于被它保護的對象的行為。顯然,依賴于CPU的看門狗是不能保證單片機在分之百不死機的。 在絕對不允許死機的裝置中,筆者設計了一種完全不依賴于CPU的看門狗——定時復位看門狗。定時復位看門狗的主體也是一個定時器,到預定時間就發出溢出脈沖,此溢出脈沖使單片機強行復位。定時復位看門狗不需要CPU FeedDog。 簡言之,定時復位看門狗就是定時地讓單片機強行復位。這樣,即使裝置死機,其最大死機時間也不會大于定時器定時時間。顯然,只要硬件完好,這種看門狗百分之百地保證了單片機不會長時間死機。在智能電表(包括IC卡電能表、復費率電能表、多功能電能表)中采用了定時復位看門狗,每1秒讓CPU強行復位,迄今數十萬電表運行了近五年,無一例死機報告。 電路設計注意事項 雖然解決的方法有很多種,但是在設計電路時我們需要注意哪些方面以便盡量的避免這些錯誤,以減少開發和調試所需時間呢? 1、電源穩定,因為電源電壓 的 不穩定會造成瞬間負電壓導致單片機故障程序無發運行 |