STM32的記憶體分配

2021-10-09 12:18:56 字數 2629 閱讀 1406

使用keil編寫**,區域性變數和全域性變數分別存放在什麼地方?

在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的,這稱為區域性變數。

使用區域性變數注意以下問題:

不同函式中可以使用相同名字的變數,它們代表不同的物件,互不干擾。

形式引數也是區域性變數。

區域性變數的作用域在函式內部。

在函式內部定義的變數是區域性變數,而在函式之外定義的變數稱為外部變數,也就是全域性變數。 使用全域性變數的注意事項:

全域性變數可以為本檔案中其他函式所共用。它的有效範圍為從定義變數的位置開始到本原始檔結束。

設定全域性變數的作用是增加了函式間資料聯絡的渠道。

如果在同乙個原始檔中,外部變數和區域性變數同名,則在區域性變數的作用範圍內,外部變數被「遮蔽」, 即外部變數將不起作用。

int g_a;

//全域性變數

intmain

(void

)

有時候希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,即占用的儲存單元不釋放,在下一次該函式呼叫時,該變數已有值,就是上一次函式呼叫結束時的值。這時可以使用關鍵字 static 進行宣告。

用 static 宣告乙個變數的作用:

對區域性變數用 static 宣告,則使用該變數在整個程式執行期間不釋放,為其分配的的空間始終存在。

全域性變數用 static宣告,則該變數的作用域只限於本檔案模組(即被宣告的檔案中) 。

區域性變數、全域性變數和**在stm32中是如何儲存的?先了解一下,儲存器的簡單概念

ram: 是「random access memory」的縮寫,被譯為隨機儲存器。

可以隨時進行讀寫操作,速度很快,掉電以後資料會丟失。比如記憶體條、 sram、 sdram、 ddr 等都是 ram。 ram 一般用來儲存程式資料、中間結果。

比如我們在程式中定義了乙個變數 a,然後對這個 a 進行讀寫操作。

rom: 是「read only memory」的縮寫,意為只能讀的儲存器。

筆者認為目前「唯讀儲存器」這個定義不準確。比如我們買手機,通常會告訴你這個手機是 4+64 或 6+128 配置,說的就是 ram 為 4gb 或 6gb, rom 為 64g 或128gb。但是這個 rom 是 flash,比如 emmc 或 ufs 儲存器,因為歷史原因,很多人還是將flash 叫做 rom。但是 emmc 和 ufs,甚至是 nand flash,這些都是可以進行寫操作的!只是寫起來比較麻煩,要先傳送要先進行擦除,然後在傳送要寫的位址或扇區,最後才是要寫入的資料。

學習過 stm32,使用過 wm25qxx 系列的 spi flash 的同學應該深有體會。

綜上所述, ram 速度快,可以直接和 cpu 進行通訊,但是掉電以後資料會丟失,容量不

容易做大(和同**的 flash 相比)。 rom(目前來說,更適合叫做 flash)速度雖然慢,但是容量

大、適合儲存資料。

stm32407有192kb的ram。128kb的sram,64kb的ccmram

code:指**的大小;

ro-data:指除了內聯資料(inline data)之外的常量資料;

rw-data:指可讀寫(rw)、已初始化的變數資料;

zi-data:指未初始化(zi)的變數資料;

code、ro-data:位於flash中;

rw-data、zi-data:位於ram中;

rw-data已初始化的資料會儲存在flash中,上電會從flash搬移至ram中。

堆區(heap): 一般由程式設計師(使用malloc)分配和(使用free)釋放, 若程式設計師不釋放,則一直被占用。一般來說,stm32微控制器類的程式一般沒有使用堆。

全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。

文字常量區(const):常量字串就是放在這裡的。

程式**區 (code): 存放函式體的二進位制**。

uint32_t a =0;

//全域性初始化區, 可以被其他 c 檔案 extern 引用

static uint32_t ss =0;

//靜態變數,只允許在本檔案使用

uint8_t *p1;

//全域性未初始化區

intmain

(void

)

通過檢視 map 檔案,可以看全域性變數在 ram 中的位置:

symbol name				value        	ov type    			size    		object

(section)

a 0x20000000 data 4 main.o(

.data)

p1 0x2000000c data 4 main.o(

.data)

ss 0x20000004 data 4 main.o(

.data)

stm32記憶體分配

原文 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等,其操作方式類似 於資料結構中的棧。2 堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統 分配 方式類似於資料結構中的鍊錶。3 全域性區 靜態區 static 全域性變數和靜...

STM32記憶體使用及分配

stack size,一般小工程0x400足夠,我們綜合實驗才設定0x1000就夠用,所以預設無需設定太大。stack size的值根據你程式中區域性變數最大尺寸計算,heap size,如果沒有用到標準庫的malloc,就是廢物,純屬浪費記憶體,所以直接設定為0即可。heap size的值如果程式...

STM32堆區分配記憶體 malloc的使用

測試環境 stm32 iar6.4 堆區大小設定為0x1000 預設值 變數定義 char p null char p2 null 1.申請記憶體大小超過設定值 p char malloc sizeof char 5090 malloc返回null,使用這段記憶體是會出錯 硬體錯誤 2.申請兩段記憶...