有個項目需要将原NXP1766晶片移植到國民N32晶片中,但是移植過程會出現當機現象。記錄下分析過程。
1、現象分析
當PC發送通信申請指令後,STM32動态申請記憶體空間存儲資料并進行處理:
當出現當機現象時,Mem_com_rx單向連結清單顯示可用空間為0:
單步調試發現程式還能運作,沒有報出錯誤,但是不能進入主任務喂狗,并且發現頻繁進入flash讀寫函數:
檢視儲存參數函數,函數本身邏輯沒有問題,參照國民給的例程擦寫,寫的時候資料長度為0x18,遠遠小于配置設定的空間。目前參數值為:
通過檢視記憶體值,發現參數值正确,沒有被誤寫入。
檢視記憶體位址,程式中需要向兩個記憶體位址中寫資料,分别是0x08071000(存儲boot燒寫狀态參數)和0x08073000(主程式運作參數)。檢視記憶體空間值發現:
0x08071000位址參數正常,但是0x08073000這個位址參數全部被清除,沒有值。正常情況如下:
分析該情況為當程式儲存參數時,需要擦除flash再寫入,當擦除後,還沒有寫入,就被别的中斷給打斷,導緻參數不正常,後續序列槽處理部分需要判斷參數值再去處理,讀出的參數值為空,則不去釋放記憶體塊,導緻當機。
2、解決方案
讀寫flash代碼為官方給的例程函數,但經過分析,操作代碼前沒有進行關中斷操作,這是比較嚴重的BUG,因為操作flash是原子操作,是以需要關閉中斷,防止被打斷。
進行上面操作以為問題已經解決,但是烤機發現還是會出現當機。經過與廠家溝通,發現有兩個問題:
- Flash讀寫有使用壽命,一般為10萬次左右,如果主程式頻繁讀寫,會造成壞塊出現;
- 寫flash的時間比較長,一般為毫秒量級,而且還需要關閉中斷,是以會導緻序列槽中斷無法産生,會出現資料丢失現象;
最終解決辦法為将存儲資料放到外部flash中,完美解決問題。
Flash問題的文章:https://blog.csdn.net/ybhuangfugui/article/details/99827002