寫在前面 Ⅰ
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
相信大家都看到過上面的信息,應(yīng)該都知道它們大概的意思,但關(guān)于存儲(chǔ)這一塊的細(xì)節(jié)知識(shí)又有多少朋友去深入理解過呢?
要知道代碼、常量、全局、局部變量存儲(chǔ)在哪兒,就需要了解FLASH和RAM的一些特性,在工程中要具體分析其大小及對(duì)應(yīng)存儲(chǔ)地址,可以從map文件中分析。
簡要說明其意思 Ⅱ
為了照顧大部分人,簡要說一下上面打印信息的意思。微主這里提醒一下大家,網(wǎng)上也有一大堆相關(guān)資料,但網(wǎng)上好些資料說的有歧義,可能會(huì)誤導(dǎo)大家,如:RW-data為已初始化的全局變量。加了static修飾的變量叫靜態(tài)變量,和全局變量還是存在差別,但已初始化的靜態(tài)變量也會(huì)歸為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ù)會(huì)存儲(chǔ)在Flash中,上電會(huì)從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存在兩種情況,但意思都差不多,只是顯示不一樣:
編譯工程(點(diǎn)擊Make),會(huì)出現(xiàn)如下信息:
72 765 bytes ofreadonly codememory
3 508 bytes ofreadonly datamemory
20 202 bytes ofreadwrite datamemory
編譯單個(gè)文件(點(diǎn)擊Compile),會(huì)出現(xiàn)下面信息(若沒有DATA就沒有那一行):
5 676 bytes ofCODEmemory
926 bytes ofCONSTmemory
1 148 bytes ofDATAmemory
readonly code:代碼大?。愃朴贑ODE);
readonly data:常量數(shù)據(jù)(類似于CONST);
readwrite data:可讀寫變量數(shù)據(jù)(類似于DATA);
說明:
IAR中的Data相當(dāng)于Keil中RW Data + ZI Data
內(nèi)存(RAM)分配 Ⅲ
本節(jié)擴(kuò)展一下RAM的一些知識(shí),有助于大家對(duì)程序運(yùn)行時(shí)RAM的情況。
內(nèi)存分為5類:
1、棧區(qū)(stack): 由編譯器自動(dòng)分配和釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。
2、堆區(qū)(heap) : 一般由程序員(使用malloc)分配和(使用free)釋放, 若程序員不釋放,則一直被占用。一般來說,單片機(jī)類的程序一般沒有使用堆。
3、全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。
4、文字常量區(qū)(const) :常量字符串就是放在這里的。
5、程序代碼區(qū) (code): 存放函數(shù)體的二進(jìn)制代碼。
經(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ū),編譯器可能會(huì)將它與p3所指向的"123456"優(yōu)化成一個(gè)地方。
}
- 
                                IAR
                                +關(guān)注
關(guān)注
5文章
394瀏覽量
38239 - 
                                keil
                                +關(guān)注
關(guān)注
69文章
1224瀏覽量
171571 - 
                                編譯
                                +關(guān)注
關(guān)注
0文章
682瀏覽量
34885 
發(fā)布評(píng)論請(qǐng)先 登錄
DDR存儲(chǔ)拓展教程
GD32F470使用__attribute__語句,keil編譯通過但是scons編譯不通過,為什么?
文件系統(tǒng),使用iar編譯報(bào)錯(cuò),gcc可以正常編譯,為什么?
如何解決在 Keil 中編譯時(shí)出現(xiàn) FILE DOES NOT EXSIT 錯(cuò)誤?
在 Keil / IAR 開發(fā)環(huán)境下的 Debug 模式下,用戶是否可以在空閑 ru 期間立即添加新的斷點(diǎn)?
請(qǐng)問如何在 Keil μVision 或 IAR EWARM 中使用觀察點(diǎn)進(jìn)行調(diào)試?
在IAR Arm開發(fā)工具鏈中--function_sections編譯選項(xiàng)的使用
    
使用RASC生成Keil工程
    
從Keil MDK到IAR EWARM:通過工程遷移實(shí)現(xiàn)項(xiàng)目資產(chǎn)的更好管理
    
Keil uVision 5安裝包下載,詳細(xì)安裝教程~
STM32CubeIDE編譯設(shè)置是否有像keil一樣有編譯后執(zhí)行Bat腳本的功能和設(shè)置?
如何獲取入口函數(shù)不是__iar_program_start的Program entry的stack使用情況
    
          
        
        
Keil、 IAR編譯存儲(chǔ)相關(guān)說明及拓展
                
 
           
            
            
                
            
評(píng)論