寫在前面 Ⅰ
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
相信大家都看到過上面的信息,應(yīng)該都知道它們大概的意思,但關(guān)于存儲這一塊的細節(jié)知識又有多少朋友去深入理解過呢?
要知道代碼、常量、全局、局部變量存儲在哪兒,就需要了解FLASH和RAM的一些特性,在工程中要具體分析其大小及對應(yīng)存儲地址,可以從map文件中分析。
簡要說明其意思 Ⅱ
為了照顧大部分人,簡要說一下上面打印信息的意思。微主這里提醒一下大家,網(wǎng)上也有一大堆相關(guān)資料,但網(wǎng)上好些資料說的有歧義,可能會誤導(dǎo)大家,如:RW-data為已初始化的全局變量。加了static修飾的變量叫靜態(tài)變量,和全局變量還是存在差別,但已初始化的靜態(tài)變量也會歸為RW-data中。
1.Keil編譯窗口信息
Program Size:Code=2596RO-data=268RW-data=44ZI-data=1028
Code:指代碼的大小;
Ro-data:指除了內(nèi)聯(lián)數(shù)據(jù)(inline data)之外的常量數(shù)據(jù);
RW-data:指可讀寫(RW)、已初始化的變量數(shù)據(jù);
ZI-data:指未初始化(ZI)的變量數(shù)據(jù);
Code、Ro-data:位于FLASH中;
RW-data、ZI-data:位于RAM中;
提醒:RW-data已初始化的數(shù)據(jù)會存儲在Flash中,上電會從FLASH搬移至RAM中。
關(guān)系如下:
RO Size= Code + RO Data
RW Size= RW Data + ZI Data
ROM Size = Code + RO Data + RW Data
2.IAR編譯窗口信息
IAR存在兩種情況,但意思都差不多,只是顯示不一樣:
編譯工程(點擊Make),會出現(xiàn)如下信息:
72 765 bytes ofreadonly codememory
3 508 bytes ofreadonly datamemory
20 202 bytes ofreadwrite datamemory
編譯單個文件(點擊Compile),會出現(xiàn)下面信息(若沒有DATA就沒有那一行):
5 676 bytes ofCODEmemory
926 bytes ofCONSTmemory
1 148 bytes ofDATAmemory
readonly code:代碼大小(類似于CODE);
readonly data:常量數(shù)據(jù)(類似于CONST);
readwrite data:可讀寫變量數(shù)據(jù)(類似于DATA);
說明:
IAR中的Data相當于Keil中RW Data + ZI Data
內(nèi)存(RAM)分配 Ⅲ
本節(jié)擴展一下RAM的一些知識,有助于大家對程序運行時RAM的情況。
內(nèi)存分為5類:
1、棧區(qū)(stack): 由編譯器自動分配和釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。
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): 存放函數(shù)體的二進制代碼。
經(jīng)典例子:
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
+關(guān)注
關(guān)注
5文章
344瀏覽量
36564 -
keil
+關(guān)注
關(guān)注
68文章
1209瀏覽量
166462 -
編譯
+關(guān)注
關(guān)注
0文章
647瀏覽量
32743
發(fā)布評論請先 登錄
相關(guān)推薦
評論