來源:公眾號【魚鷹談單片機】
作者:魚鷹Osprey
ID :emOsprey
大家好,我是魚鷹。
不知道你是否遇到這樣的情況,一直正常使用的 bin 文件,當下載到一個新板子后,或者將主控板安裝到新的環境中,出現了反復重啟。
一般出現這種情況,魚鷹第一反應是外部環境導致的軟件 bug,而追根究底還是軟件問題。
其實像這種復現率很高的反復重啟的問題,使用在線調試是非常容易定位的,并且也必須解決(不要認為常規情況下不存在這種硬件環境就不解決),否則后患無窮。
這里主要討論哪些環境可能導致重啟:
1、斷言失敗。某種情況下導致的斷言失敗,比如 EEPROM 里面保存參數異常,或者 eeprom 有問題,導致使用了默認參數,而默認參數處理有問題。
2、堆不足。比如一塊大內存一般情況下,只會在開機申請一次,但由于某種條件,出現多次申請,如 mdns 服務多次進行回調處理時。
3、無法及時喂狗。比如外部中斷(IO、串口)頻繁進入,導致無法及時喂狗,或者某個 I2C 外設出現問題,導致死等外設數據等。
4、運行時序不正常。比如程序檢測某些外設異常,想通過 CAN 上報數據,而此時 CAN 外設沒有進行初始化,一些指針未準備好導致。而一般正常的板子外設是正常的,也就不會使用 CAN 上報數據,因此不會觸發 bug。
5、棧溢出。軟件檢測外設時遇到異常情況,需要進入一個異常分支,而這個異常分支函數調用非常深(或局部變量大),導致消耗了太多的棧,最終引發了 hardfault 問題。