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

簡述AMD INFINITY GUARD對安全至關重要的五大原因
開發人員使用Helix QAC實現靜態代碼測試合規性的五大原因

開發人員使用Klocwork進行軟件安全的五大原因

評論