在MCU程序開(kāi)發(fā)調(diào)試過(guò)程中,總會(huì)發(fā)現(xiàn)很多的程序bug。有一些bug是邏輯問(wèn)題,規(guī)格書理解問(wèn)題,筆誤問(wèn)題等,以上列出的這些問(wèn)題,通過(guò)斷點(diǎn),單步等調(diào)試手段,很容易發(fā)現(xiàn)并解決問(wèn)題。但是有一些程序的bug就比較難通過(guò)常規(guī)手段定位出問(wèn)題的地點(diǎn)和原因,例如:芯片不定時(shí)跑飛和復(fù)位。
以下總結(jié)了芯片不定時(shí)跑飛和復(fù)位的5大原因
1、看門狗復(fù)位
原因:程序中使用了看門狗,但是沒(méi)有及時(shí)清看門狗,從而導(dǎo)致看門狗復(fù)位,使程序直接跳到復(fù)位位置。
解決方法:通過(guò)讀或?qū)?a href="http://www.wenjunhu.com/tags/rs/" target="_blank">RSTSTAT寄存器,在程序中清看門狗。
示例:
A.程序中寫RSTSTAT寄存器清看門狗。
2、中斷服務(wù)程序缺失
原因:程序中打開(kāi)了某個(gè)中斷,但是沒(méi)有相應(yīng)的中斷服務(wù)程序,從而導(dǎo)致在中斷發(fā)生后,找不到中斷服務(wù)程序入口,從而導(dǎo)致程序跑飛。
解決方法:檢查程序中是否存在打開(kāi)了某個(gè)中斷,但是沒(méi)有相對(duì)應(yīng)的中斷服務(wù)程序。
示例:
A.使能外部中斷0,并且屏蔽外部中斷0服務(wù)程序。
B.下降沿觸發(fā)外部中斷0后,程序跑到地址0x0003處(INT0向量地址為0x0003),由于沒(méi)有中斷服務(wù)程序,該地址的指令被編譯器填充為初始化程序,因此導(dǎo)致程序跑飛。
3、 中斷服務(wù)程序沒(méi)有對(duì)bank壓棧和出棧
原因:主程序在操作bank1寄存器時(shí),進(jìn)入中斷沒(méi)有對(duì)bank1壓棧,此時(shí)切換到bank0對(duì)寄存器操作,退出中斷后由于沒(méi)有保存bank1的狀態(tài),導(dǎo)致主程序在bank0中對(duì)bank1的寄存器操作,誤改bank0寄存器的值,程序可能會(huì)運(yùn)行異常。
解決方法:進(jìn)入中斷服務(wù)程序后,對(duì)bank進(jìn)行壓棧,退出中斷之前對(duì)bank進(jìn)行出棧,這樣無(wú)論主程序在操作bank0還是bank1,中斷里面都會(huì)保存進(jìn)中斷之前bank狀態(tài),退出中斷后會(huì)還原bank狀態(tài),這樣就不會(huì)因?yàn)榍袚Qbank導(dǎo)致寄存器的值被誤改。
示例:
A.在主循環(huán)操作bank1寄存器,定時(shí)器Timer3中斷里面不進(jìn)行壓棧和出棧操作,直接操作bank0寄存器。
B.退出中斷后此時(shí)程序狀態(tài)為bank0,下一步返回主程序,本來(lái)應(yīng)該改變的是P5_0的值,由于沒(méi)有切換到bank1,所以在bank0中將相同地址的寄存器P0_0的值誤改,同時(shí)導(dǎo)致P5_0的值修改無(wú)效。
4、數(shù)組越界
原因:程序中定義的數(shù)組元素的個(gè)數(shù)小于程序中實(shí)際使用的數(shù)組元素的個(gè)數(shù),數(shù)組使用循環(huán)函數(shù)時(shí),如果循環(huán)變量沒(méi)控制好則會(huì)出現(xiàn)數(shù)組越界,意外修改其他變量值可能會(huì)導(dǎo)致程序異常。
解決方法:檢查函數(shù)中調(diào)用的數(shù)組是否存在越界的情況。
示例:
A.定義SendBuffer和RecBuffer兩個(gè)數(shù)組變量,數(shù)組長(zhǎng)度為5,初值均為0。
B.主程序中對(duì)數(shù)組SendBuffer[0]~ SendBuffer[4]賦值,此時(shí)SendBuffer[5]和SendBuffer[6]也被意外賦值,從watch窗口可以看出,這兩個(gè)值改變了原來(lái)RecBuffer[0]和RecBuffer[1]的值,可能會(huì)造成程序異常。
5、堆棧溢出
原因:函數(shù)嵌套太深或者局部變量太多導(dǎo)致超出堆??臻g,正常數(shù)據(jù)被改寫。
解決方法:盡量減少函數(shù)調(diào)用層級(jí),局部變量不要使用太多,尤其是局部大數(shù)組,從而減少壓棧的時(shí)候所需的空間。
示例:
A.定義4個(gè)全局變量和1個(gè)局部變量數(shù)組,總共占用RAM空間為249個(gè)字節(jié)
B.計(jì)算程序中所需的堆棧大小,主程序中調(diào)用Delay()函數(shù),占用2個(gè)字節(jié),中斷服務(wù)函數(shù)占用16個(gè)字節(jié),中斷嵌套調(diào)用leddisplay()函數(shù),占用2個(gè)字節(jié),總共需要20個(gè)字節(jié)堆??臻g,由A可知,系統(tǒng)只剩下6個(gè)字節(jié)堆??臻g,所以程序運(yùn)行后,堆棧一定會(huì)溢出。
C.運(yùn)行程序,正?,F(xiàn)象為P40端口一直翻轉(zhuǎn),TestData變量值始終為0,觸發(fā)外部中斷0,進(jìn)入中斷服務(wù)程序后,可以看到SP堆棧指針已經(jīng)溢出,同時(shí)將R7寄存器的值壓棧到0x08的地址上,通過(guò).m51文件可以查到0x08正好是TestData變量地址,所以TestData的值被誤改為0x01,導(dǎo)致主程序中條件判斷出錯(cuò),程序異常。
在調(diào)試MCU程序過(guò)程中,由于程序書寫的不規(guī)范產(chǎn)生程序漏洞,跑飛現(xiàn)象比較常見(jiàn),如果我們提前了解程序可能跑飛的原因,對(duì)于快速定位問(wèn)題有很大幫助,從而提高分析和解決問(wèn)題的效率,減少產(chǎn)品的開(kāi)發(fā)周期,加速產(chǎn)品的上市時(shí)間。
原文標(biāo)題:中穎8bit MCU程序跑飛原因分析
文章出處:【微信公眾號(hào):中穎電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
芯片
+關(guān)注
關(guān)注
459文章
52006瀏覽量
434431 -
mcu
+關(guān)注
關(guān)注
146文章
17763瀏覽量
358950 -
復(fù)位
+關(guān)注
關(guān)注
0文章
178瀏覽量
24525 -
中穎電子
+關(guān)注
關(guān)注
4文章
176瀏覽量
7843
原文標(biāo)題:中穎8bit MCU程序跑飛原因分析
文章出處:【微信號(hào):SINO_25181447,微信公眾號(hào):中穎電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
智能手表2016年第三季度出貨量下滑 五大原因分析
TC233使用QSPI跑SPI程序單片機(jī)不定時(shí)復(fù)位的原因?
五大原廠解決方案,下載即可贏取“豪禮”
五大原廠解決方案,下載即可贏取“豪禮”
五大原廠解決方案,下載即可贏取“豪禮”
五大原廠解決方案,下載即可贏取“豪禮”
單片機(jī)程序跑飛原因是什么
單片機(jī)程序跑飛的幾種原因
智能手機(jī)為什么需要M2M的五大原因
從LED光源的五大原物料淺析LED死燈的25種原因
看門狗定時(shí)器防止溢出復(fù)位程序

簡(jiǎn)述AMD INFINITY GUARD對(duì)安全至關(guān)重要的五大原因
開(kāi)發(fā)人員使用Helix QAC實(shí)現(xiàn)靜態(tài)代碼測(cè)試合規(guī)性的五大原因

開(kāi)發(fā)人員使用Klocwork進(jìn)行軟件安全的五大原因

評(píng)論