單片機程式又跑飛?! 三種跑飛現象分析 [單晶片程式(韌體/firmware) 異常原因/除錯]
單片機程式又跑飛?! 三種跑飛現象分析 [單晶片程式(韌體/firmware) 異常原因/除錯]
資料來源: https://mp.weixin.qq.com/s/5Exlbr_ztFhfZlL0B7DdWQ
1 陣組越界/溢出
現象:
單片機程式在函數中運行時,總是在運行到函數末尾,要跳出函數時,程式跑飛。
原因:
數位上繼群組越界(陣列溢出),函數中定義的數位元素的個數小於程式中實際使用的陣列元素的個數,例如在函數中定義了一個數位ucDataBuff[10],這個陣列只有10個元素,但是在函數中卻有這樣的語句ucDataBuff[10]=0x1a,這個語句是給數位的第11個元素賦值,:由於定義的數位只有10個元素, 從而導致賦值語句中不知道把0x1a放到什麼地方,從而導致程式跑飛。
解決方法:
如果在調試程式時,發現程式總是在函數執行完畢時跑飛,多數情況是發生了陣列越界(陣列溢出)的錯誤,仔細檢查函數中調用的陣列是否存在越界(溢出)的情況。
2 中斷服務程式缺失
現象:
程序運行過程中總是跑飛。
原因:
程式中打開了某個中斷,但是卻沒有相應的中斷服務程式,從而導致在中斷發生后,找不到中斷服務程式入口,從而導致程式跑飛。
解決方法:
檢查程式中是否存在打開了某個中斷,但是沒有相對應的中斷服務程式。
3 看門狗複位
現象:
在執行一段較為耗費時間的程式時,程式跑飛,並且總是跳到複位位置處。
原因:
程式中使用了看門狗,但是沒有及時「餵狗」,從而導致看門狗複位,使程式直接跳到複位位置。
解決方法:
根據程式運行時間,尤其是一定要計算清楚最耗時的那段程式的運行時間,然後準確設置看門狗的複位時長,定時“餵狗”,尤其是如果有死迴圈的情況,一定要在死迴圈中記得“餵狗”。