寫在前面 Ⅰ
Keil、IAR編譯(Build)窗口打印出來的信息:
Program Size:Code=2596RO-data=268RW-data=44ZI-data=1028
72 765 bytes ofreadonly codememory
3 508 bytes ofreadonly datamemory
20 202 bytes ofreadwrite datamemory
5 676 bytes ofCODEmemory
926 bytes ofCONSTmemory
1 148 bytes ofDATAmemory
相信大家都看到過上面的信息,應該都知道它們大概的意思,但關于存儲這一塊的細節(jié)知識又有多少朋友去深入理解過呢?
要知道代碼、常量、全局、局部變量存儲在哪兒,就需要了解FLASH和RAM的一些特性,在工程中要具體分析其大小及對應存儲地址,可以從map文件中分析。
簡要說明其意思 Ⅱ
為了照顧大部分人,簡要說一下上面打印信息的意思。微主這里提醒一下大家,網上也有一大堆相關資料,但網上好些資料說的有歧義,可能會誤導大家,如:RW-data為已初始化的全局變量。加了static修飾的變量叫靜態(tài)變量,和全局變量還是存在差別,但已初始化的靜態(tài)變量也會歸為RW-data中。
1.Keil編譯窗口信息
Program Size:Code=2596RO-data=268RW-data=44ZI-data=1028
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中。
關系如下:
RO Size= Code + RO Data
RW Size= RW Data + ZI Data
ROM Size = Code + RO Data + RW Data
2.IAR編譯窗口信息
IAR存在兩種情況,但意思都差不多,只是顯示不一樣:
編譯工程(點擊Make),會出現如下信息:
72 765 bytes ofreadonly codememory
3 508 bytes ofreadonly datamemory
20 202 bytes ofreadwrite datamemory
編譯單個文件(點擊Compile),會出現下面信息(若沒有DATA就沒有那一行):
5 676 bytes ofCODEmemory
926 bytes ofCONSTmemory
1 148 bytes ofDATAmemory
readonly code:代碼大小(類似于CODE);
readonly data:常量數據(類似于CONST);
readwrite data:可讀寫變量數據(類似于DATA);
說明:
IAR中的Data相當于Keil中RW Data + ZI Data
內存(RAM)分配 Ⅲ
本節(jié)擴展一下RAM的一些知識,有助于大家對程序運行時RAM的情況。
內存分為5類:
1、棧區(qū)(stack): 由編譯器自動分配和釋放 ,存放函數的參數值,局部變量的值等。
2、堆區(qū)(heap) : 一般由程序員(使用malloc)分配和(使用free)釋放, 若程序員不釋放,則一直被占用。一般來說,單片機類的程序一般沒有使用堆。
3、全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。
4、文字常量區(qū)(const) :常量字符串就是放在這里的。
5、程序代碼區(qū) (code): 存放函數體的二進制代碼。
經典例子:
int a = 0; 全局初始化區(qū)
char *p1; 全局未初始化區(qū)
main(void)
{
int b;// 棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; 123456\0";//在常量區(qū),p3在棧上。
static int c =0; //全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。
strcpy(p1, "123456"); //123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方。
}
-
IAR
+關注
關注
5文章
369瀏覽量
37233 -
keil
+關注
關注
69文章
1223瀏覽量
168939 -
編譯
+關注
關注
0文章
676瀏覽量
33735
發(fā)布評論請先 登錄
使用RASC生成Keil工程

從Keil MDK到IAR EWARM:通過工程遷移實現項目資產的更好管理

Keil uVision 5安裝包下載,詳細安裝教程~
STM32CubeIDE編譯設置是否有像keil一樣有編譯后執(zhí)行Bat腳本的功能和設置?
如何獲取入口函數不是__iar_program_start的Program entry的stack使用情況

分享一個keil MDK編譯信息增強工具
GD32F103 Keil和IAR pack包
keil可以讀出單片機的程序嗎
keil軟件仿真如何仿真輸入
怎樣將keil中的程序導出
Keil中變量不被初始化方法

評論