時(shí)間:2018-08-21 00:00:00 來(lái)源:信盈達(dá) 作者:信盈達(dá)
有時(shí),在寫(xiě)ARM時(shí)會(huì)遇到經(jīng)常死機(jī)的情況,莫名其妙,在這里我總結(jié)了一些單片機(jī)/ARM死機(jī)或者跑飛的一些常見(jiàn)的查找方法和我對(duì)此的一些拙見(jiàn)希望對(duì)大家有幫助。
“死機(jī)”和“跑飛”
隨著單片機(jī)在能源領(lǐng)域中的廣泛應(yīng)用,單片機(jī)的抗干擾問(wèn)題越來(lái)越突出,煤礦井下環(huán)境一般比較惡劣,這便會(huì)為單片機(jī)控制系統(tǒng)帶來(lái)各種干擾,以致系統(tǒng)不能正常工作。單片機(jī)應(yīng)用系統(tǒng)的抗干擾性能主要取決于硬件的抗干擾設(shè)計(jì),但軟件抗干擾設(shè)計(jì)作為硬件抗干擾的完善和補(bǔ)充,作用也非常重要,因?yàn)榇罅康母蓴_通常并不能影響系統(tǒng)內(nèi)硬件的運(yùn)作,卻常會(huì)使系統(tǒng)的軟件無(wú)法正常運(yùn)行,單片機(jī)應(yīng)用的一個(gè)突出問(wèn)題,便是單片機(jī)運(yùn)行過(guò)程中經(jīng)常出現(xiàn)的程序跑飛現(xiàn)象。
在單片機(jī)系統(tǒng)中,因?yàn)楦蓴_的原因,在非預(yù)期的情況下,使得程序計(jì)數(shù)器PC 的值發(fā)生隨機(jī)的變化,從而使得程序的流向指向不確定區(qū)域,這便是程序的跑飛。程序跑飛后或者會(huì)使指令的地址碼和操作碼發(fā)生改變,PC 把操作數(shù)當(dāng)作指令來(lái)執(zhí)行;或者PC值指向一條不合邏輯關(guān)系的指令甚或是非程序區(qū),運(yùn)行結(jié)果常常會(huì)使單片機(jī)進(jìn)入死循環(huán)———便是大家常說(shuō)的“死機(jī)”。為確保在無(wú)人當(dāng)值的情況下,單片機(jī)“死機(jī)”后能自動(dòng)恢復(fù)過(guò)來(lái),通常采用軟件陷阱,外部WDT 電路,以及軟件控制的WATCHDOG 等方法,使系統(tǒng)恢復(fù)正常(后兩種俗稱(chēng)“看門(mén)狗”)。
出錯(cuò)原因分析
那在程序運(yùn)行出現(xiàn)這些錯(cuò)誤時(shí),我們要從哪些方面進(jìn)行分析呢?
1、意外中斷。
確認(rèn)下是否打開(kāi)了某個(gè)中斷,但是沒(méi)有響應(yīng)和**中端標(biāo)志,導(dǎo)致程序一直進(jìn)入中斷,造成死機(jī)假象。
2、 中斷變量處理不妥。
若定義某些會(huì)在中斷中修改的全局變量,這時(shí)要注意兩個(gè)問(wèn)題:首先為了防止編譯器優(yōu)化中斷變量,要在這些變量定義時(shí)前加 volatile,其次在主循環(huán)中讀取中斷變量前應(yīng)該首先關(guān)閉全局中斷,防止讀到一半被中斷給修改了,讀完之后再打開(kāi)全局中斷;否則出現(xiàn)造成數(shù)據(jù)亂套。
3、地址溢出,常見(jiàn)錯(cuò)誤為指針操作錯(cuò)誤。
我要著重說(shuō)的是數(shù)組下標(biāo)使用循環(huán)函數(shù)中循環(huán)變量,如果循環(huán)變量沒(méi)控制好則會(huì)出現(xiàn)數(shù)組下標(biāo)越界,意外修改系統(tǒng)的寄存器造成死機(jī),這種情況下如果死機(jī)說(shuō)明運(yùn)氣好,否則后面不知道發(fā)生什么頭疼的事。
4、 無(wú)條件的死循環(huán)。
比如使用while(x);等待電平變化,正常情況下x都會(huì)變成0,就怕萬(wàn)一,因此最好加上時(shí)間限制;
5、看門(mén)狗沒(méi)有關(guān)閉。
有的單片機(jī)即使沒(méi)使用看門(mén)狗開(kāi)機(jī)時(shí)也有可能意外自動(dòng)開(kāi)啟了最小周期的看門(mén)狗,導(dǎo)致軟件不斷復(fù)位,造成死機(jī),這個(gè)要看芯片手冊(cè),最好在程序復(fù)位后首先應(yīng)該顯式**看門(mén)狗再關(guān)閉看門(mén)狗;
6、 堆棧溢出。
最難查找的問(wèn)題,對(duì)于容量小的單片機(jī),盡量減少函數(shù)調(diào)用層級(jí),減少局部變量,從而減少壓棧的時(shí)候所需的空間。當(dāng)你把以上幾條都試過(guò)不能解決問(wèn) 題,試一試把你的被調(diào)用少函數(shù)直接內(nèi)置到調(diào)用的地方并且把占用RAM大的局部變量改成全局變量,試一試說(shuō)不定就可以了。
處理方法
找出原因后,我們要怎么處理呢?
死機(jī)是指CPU的程序指針進(jìn)入一個(gè)死循環(huán),無(wú)法執(zhí)行正常的程序流程。其外在表現(xiàn)常常是:正常功能喪失,按鍵無(wú)響應(yīng),顯示凝固。單片機(jī)死機(jī)后,只有復(fù)全才能走出死循環(huán),執(zhí)行正常的程序流程。眾所屬知,克服死機(jī)的最有效手段是加看門(mén)狗(WatchDog)。
目前用得最廣泛的看門(mén)狗實(shí)際上是一個(gè)特殊的定時(shí)器DogTimer。DogTimer按固定速率計(jì)時(shí),計(jì)滿(mǎn)預(yù)定時(shí)間就發(fā)出溢出脈沖使單片機(jī)復(fù)位。如果每次在DogTimer溢出前強(qiáng)行讓DogTimer清零,就不會(huì)發(fā)出溢出脈沖。清零脈沖由CPU發(fā)出,在單片機(jī)程序中每隔一段語(yǔ)句放一個(gè)清DogTimer的語(yǔ)句——FeedDog語(yǔ)句,以保證程序正常運(yùn)行時(shí)DogTimer不會(huì)溢出。一旦程序進(jìn)入一個(gè)不含F(xiàn)eedDog語(yǔ)句的死循環(huán),DogTimer將溢出,導(dǎo)致單片機(jī)復(fù)位,跳出這個(gè)死循環(huán)。本文稱(chēng)這種看門(mén)狗為典型看門(mén)狗,典型看門(mén)狗已被集成比,如MAX706、MAX791等[1];還有許多單片機(jī)本身集成了這種看門(mén)狗,如PIC16C57、MC68HC705等,
有一個(gè)錯(cuò)誤觀點(diǎn):加了看門(mén)狗,單片機(jī)就不會(huì)死機(jī)。實(shí)際上,看門(mén)狗有時(shí)間會(huì)完全失效。當(dāng)程序進(jìn)入某個(gè)死循環(huán),而這個(gè)死循環(huán)中又包含F(xiàn)eedDog語(yǔ)句,這時(shí)DogTimer始終不會(huì)溢出,單片機(jī)始終得不到復(fù)位信號(hào),程序也就始終跳不出這個(gè)死循環(huán)。針對(duì)這一弊端,筆者設(shè)計(jì)了雙對(duì)限看門(mén)狗和定時(shí)復(fù)位看門(mén)狗。
雙時(shí)限看門(mén)狗有兩個(gè)定時(shí)器;一個(gè)為短定時(shí)器,一個(gè)為長(zhǎng)定時(shí)器。短定時(shí)器定時(shí)為T(mén)1,長(zhǎng)定時(shí)器定時(shí)為T(mén)2,0 。這樣,當(dāng)程序進(jìn)入某個(gè)死循環(huán),如果這個(gè)死循環(huán)包含短定時(shí)器FeedDog語(yǔ)句而不包含長(zhǎng)定時(shí)器FeedDog語(yǔ)句,那么長(zhǎng)定時(shí)順終將溢出,使單片機(jī)復(fù)位。巧妙安排長(zhǎng)定時(shí)器FeedDog語(yǔ)句的位置,可保證出現(xiàn)死機(jī)的概率根低。
目前幾乎所有的看門(mén)狗都是依賴(lài)于CPU(依賴(lài)于CPU FeedDog)。這可以比作:一個(gè)保險(xiǎn)設(shè)備能否起到保險(xiǎn)作用還依賴(lài)于被它保護(hù)的對(duì)象的行為。顯然,依賴(lài)于CPU的看門(mén)狗是不能保證單片機(jī)在分之百不死機(jī)的。
在絕對(duì)不允許死機(jī)的裝置中,筆者設(shè)計(jì)了一種完全不依賴(lài)于CPU的看門(mén)狗——定時(shí)復(fù)位看門(mén)狗。定時(shí)復(fù)位看門(mén)狗的主體也是一個(gè)定時(shí)器,到預(yù)定時(shí)間就發(fā)出溢出脈沖,此溢出脈沖使單片機(jī)強(qiáng)行復(fù)位。定時(shí)復(fù)位看門(mén)狗不需要CPU FeedDog。
簡(jiǎn)言之,定時(shí)復(fù)位看門(mén)狗就是定時(shí)地讓單片機(jī)強(qiáng)行復(fù)位。這樣,即使裝置死機(jī),其最大死機(jī)時(shí)間也不會(huì)大于定時(shí)器定時(shí)時(shí)間。顯然,只要硬件完好,這種看門(mén)狗百分之百地保證了單片機(jī)不會(huì)長(zhǎng)時(shí)間死機(jī)。在智能電表(包括IC卡電能表、復(fù)費(fèi)率電能表、多功能電能表)中采用了定時(shí)復(fù)位看門(mén)狗,每1秒讓CPU強(qiáng)行復(fù)位,迄今數(shù)十萬(wàn)電表運(yùn)行了近五年,無(wú)一例死機(jī)報(bào)告。
電路設(shè)計(jì)注意事項(xiàng)
雖然解決的方法有很多種,但是在設(shè)計(jì)電路時(shí)我們需要注意哪些方面以便盡量的避免這些錯(cuò)誤,以減少開(kāi)發(fā)和調(diào)試所需時(shí)間呢?
1、電源穩(wěn)定,因?yàn)殡娫措妷?的 不穩(wěn)定會(huì)造成瞬間負(fù)電壓導(dǎo)致單片機(jī)故障程序無(wú)發(fā)運(yùn)行
2、IO保護(hù)
3、振蕩器PCB布線要注意
4、復(fù)位電路設(shè)計(jì)和PCB布線
5、電源,信號(hào)線干擾路徑的保護(hù),加濾波TVS等
6、高速信號(hào)輸出遠(yuǎn)離信號(hào)輸入端,如SPI總線,I2C總線布線要遠(yuǎn)離ADC,復(fù)位,時(shí)鐘等布線處,以及其他模擬前端。
信盈達(dá)2008年在深圳特區(qū)南山高新科技園成立。自成立至今近九年來(lái)專(zhuān)注為企業(yè)和個(gè)人提供高端方案設(shè)計(jì)、高端嵌入式/Android培訓(xùn)等服務(wù)。公司下設(shè)信盈達(dá)實(shí)訓(xùn)學(xué)院、信盈達(dá)研發(fā)中心、信盈達(dá)教學(xué)儀器三大業(yè)務(wù)板塊。九年來(lái)公司堅(jiān)持"技術(shù)領(lǐng)先、服務(wù)領(lǐng)先",以雄厚的實(shí)力和專(zhuān)業(yè)的品質(zhì)成為國(guó)內(nèi)唯一有實(shí)力從產(chǎn)品最底層研發(fā)到系統(tǒng)層開(kāi)發(fā)的嵌入式實(shí)訓(xùn)、產(chǎn)品解決方案提供商。為中國(guó)IT行業(yè)提供最具價(jià)值的職業(yè)教育服務(wù)。專(zhuān)業(yè)培訓(xùn)嵌入式、物聯(lián)網(wǎng)、人工智能、Java、單片機(jī)等課程,想了解更多信息點(diǎn)擊立馬咨詢(xún)
免費(fèi)領(lǐng)取試聽(tīng)卡
申請(qǐng)已經(jīng)提交
老師會(huì)馬上給您安排試聽(tīng)課程!
申請(qǐng)出錯(cuò)了
您可以加老師QQ:914865590報(bào)名咨詢(xún)!