在使用keil開發STM32應用程式時,點擊Build后在Build Output視窗中經常會有如下資訊:

圖中幾個引數分別代表
Code:代碼的大小
RO:常量所占空間
RW:程式中已經初始化的變數所占空間
ZI:未初始化的static變數和全域變數以及堆疊所占的空間
上述引數和芯片Flash以及SRAM的對應關系是
Flash占用大小=Code+RO+RW
SRAM占用大小=RW+ZI
RW引數同時參與了Flash和SRAM占用量的計算,這是因為Flash部分的屬性是Read-Only的,而SRAM雖然是Read-Write但里面資料不能掉電保存,所以只能把已經初始化的值保存到ROM里,上電后再拷貝到SRAM中進行讀寫操作,即兩部分都需要留出RW變數所占用的空間。
如圖:

結合上圖說下STM32的啟動程序(采用Cortex-M4、Cortex-M3內核的芯片基本都是這個程序):上電后首先從 0x00000000(映射到0x08000000,這里只考慮從內部Flash啟動)處獲得中斷向量表,然后在運行用戶代碼之前會在標號2處有一段引導代碼負責把存在Flash中的初始化變數的值Copy到SRAM中對應的變數位置(標號3),之后把ZI區全部清零(標號4),之后才正式開始運行用戶代碼(標號5)。
所以RW-DATA的資料上電運行后會被Copy到RAM里。
問題:
如果程式運行程序中,我操作寫flash,并且是在原RW-DATA的記憶體地址上寫了新的資料,那豈不是原來的RW-DATA資料就會被清除,下次上電啟動程式時,程式是否會啟動失敗?(我實際上寫的程式運行程序中沒有問題,即使重新上電運行,所以很迷茫這個問題,希望有人幫忙解答一下疑問)
uj5u.com熱心網友回復:
光看這個地址分配,啟動倒不會有問題,但有些變數初始值可能變了
uj5u.com熱心網友回復:
但是運行一段時間,經常操作flash,目前還沒發現出問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/109929.html
標籤:單片機/工控
下一篇:在BSP Builder進行Compile時出現Error during compilation:Fitter failed要怎么解決
