天天看點

flash讀寫導緻當機問題分析1、現象分析

有個項目需要将原NXP1766晶片移植到國民N32晶片中,但是移植過程會出現當機現象。記錄下分析過程。

1、現象分析

當PC發送通信申請指令後,STM32動态申請記憶體空間存儲資料并進行處理:

flash讀寫導緻當機問題分析1、現象分析

當出現當機現象時,Mem_com_rx單向連結清單顯示可用空間為0:

flash讀寫導緻當機問題分析1、現象分析

單步調試發現程式還能運作,沒有報出錯誤,但是不能進入主任務喂狗,并且發現頻繁進入flash讀寫函數:

flash讀寫導緻當機問題分析1、現象分析

檢視儲存參數函數,函數本身邏輯沒有問題,參照國民給的例程擦寫,寫的時候資料長度為0x18,遠遠小于配置設定的空間。目前參數值為:

flash讀寫導緻當機問題分析1、現象分析
flash讀寫導緻當機問題分析1、現象分析

通過檢視記憶體值,發現參數值正确,沒有被誤寫入。

檢視記憶體位址,程式中需要向兩個記憶體位址中寫資料,分别是0x08071000(存儲boot燒寫狀态參數)和0x08073000(主程式運作參數)。檢視記憶體空間值發現:

flash讀寫導緻當機問題分析1、現象分析
flash讀寫導緻當機問題分析1、現象分析

0x08071000位址參數正常,但是0x08073000這個位址參數全部被清除,沒有值。正常情況如下:

flash讀寫導緻當機問題分析1、現象分析

分析該情況為當程式儲存參數時,需要擦除flash再寫入,當擦除後,還沒有寫入,就被别的中斷給打斷,導緻參數不正常,後續序列槽處理部分需要判斷參數值再去處理,讀出的參數值為空,則不去釋放記憶體塊,導緻當機。

2、解決方案

讀寫flash代碼為官方給的例程函數,但經過分析,操作代碼前沒有進行關中斷操作,這是比較嚴重的BUG,因為操作flash是原子操作,是以需要關閉中斷,防止被打斷。

flash讀寫導緻當機問題分析1、現象分析

       進行上面操作以為問題已經解決,但是烤機發現還是會出現當機。經過與廠家溝通,發現有兩個問題:

  1. Flash讀寫有使用壽命,一般為10萬次左右,如果主程式頻繁讀寫,會造成壞塊出現;
  2. 寫flash的時間比較長,一般為毫秒量級,而且還需要關閉中斷,是以會導緻序列槽中斷無法産生,會出現資料丢失現象;

最終解決辦法為将存儲資料放到外部flash中,完美解決問題。

Flash問題的文章:https://blog.csdn.net/ybhuangfugui/article/details/99827002

繼續閱讀