STM中FLASH和RAM的關係

2021-10-06 15:25:37 字數 1655 閱讀 7767

一、stm32中的記憶體分布情況

要搞清楚stm32 flash、ram的使用情況,就需要理清楚stm32的儲存結構。

在stm32中,flash,sram暫存器和輸入輸出埠被組織在同乙個線性位址空間內

c語言上分為棧、堆、bss、data、code段。重點分析一下stm32以及在mdk裡面段的劃分。

mdk下code,ro-data,rw-data,zi-data這幾個段:

code是儲存程式**的。

ro-data是儲存const常量和指令。(read-only-data)

rw-data是儲存初始化值不為0的全域性變數。(read-write-data)

zi-data是儲存未初始化的全域性變數或初始化值為0的全域性變數。(zero-initialize-data)

flash=code + ro data + rw data;

ram= rw-data+zi-data;

這個是mdk編譯之後能夠得到的每個段的大小,也就能得到占用相應的flash和ram的大小,但是還有兩個資料段也會占用ram,但是是在程式執行的時候,才會占用,那就是堆和棧。在stm32的啟動檔案.s檔案裡面,就有堆疊的設定,其實這個堆疊的記憶體占用就是在上面ram分配給rw-data+zi-data之後的位址開始分配的。

在stm32的啟動檔案中,statrtup_stm32******x.s檔案中,有一句這樣的函式

表示棧的大小為0x400也就是1024位元組,堆的大小0x400也是1024位元組(這裡的堆進行了修改)。這樣cpu在處理任務的時候,函式區域性變數最多可以占用的空間大小為1024位元組。這裡的棧大小包括函式的巢狀,遞迴等等,都是從這個棧裡面分配出來的。

所以如果乙個函式的區域性變數過多,或者巢狀層數越深,那麼程式非常容易出現崩潰的情況。所以一定不要在函式裡放過多或者比較大的區域性變數/buf。

堆的增長方向時向上的,而棧的增長方向時向下的,並且沒有固定的界限,一旦堆疊衝突,函式就會崩潰。總體上也就是說,在使用堆疊的過程中,一定要確保堆疊的大小及使用情況。

二、stm32上的記憶體使用情況查詢

在stm32編譯的時候會生成.map檔案。如果沒有.map檔案的話見下圖中memory map是否勾選。

map檔案中內容很多,感興趣可以自己仔細研究一下,這裡只拿出幾個問題進行舉例,例下兩圖中,我們可以清晰的看到每乙個檔案中所編譯的**大小這裡包含了我們前面所說的code,ro-data,rw-data,zi-data這幾部分,甚至,我們還可以看到每乙個變數的大小,以及編譯之後的位址

RAM和 flash這個東西

因為sram的位址具有唯一性,其實資料線也有唯一性。也就是a0 a18,d0 d15,都是唯一的。正常是 a0 a18,接fsmc的a0 a18。d0 d15,接fsmc的d0 d15.假設我們a0和a18對調了,也就是a18接fsmc的a0,a0接fsmc的a18,其他不變。這樣,寫位址1的時候,...

STM32的RAM與FLASH,啟動流程

stm32片上有兩塊記憶體分別是片上flash用來儲存 片上ram相當於記憶體。這裡我們解釋一下,編譯結果裡面的幾個資料的意義 code 表示程式所占用 flash 的大小 flash ro data 即 read only data,表示程式定義的常量,如 const 型別 flash rw da...

DSP28335 燒寫到RAM和FLASH方法

1.燒寫到ram 把28335 ram lnk.cmd檔案拷貝到 dsp2833x libraries 資料夾裡,編譯 燒錄 執行 2.燒寫到flash 第一步 把f28335.cmd檔案和dsp2833x memcopy.c檔案拷貝到 dsp2833x libraries 資料夾裡 第二步 主函式...