stm32存儲(chǔ)器結(jié)構(gòu)、 IAR 開發(fā)環(huán)境下的.icf 文件、.map文件 解析
掃描二維碼
隨時(shí)隨地手機(jī)看文章
新建 IAR環(huán)境 STM32工程,報(bào)錯(cuò):
Error[Lp011]: section placement failed: unable to allocate space for sections/blocks with a total estimated minimum size of 0x9ca8 bytes in <[0x20000000-0x20004fff]> (total uncommitted space 0x5000).
原因:沒指定.icf文件而導(dǎo)致不能夠給段/塊分配空間....。當(dāng)然,這解釋未必使用其他情況。
回想下IAR 建立工程還有.icf 文件一說.....手生啦。
想著盡量弄清楚些,今個(gè)得空+有這個(gè)心情。奏起:
STM32存儲(chǔ)器結(jié)構(gòu)首先,我們對(duì)比一下Cortex-M3存儲(chǔ)器結(jié)構(gòu)和STM32存儲(chǔ)器結(jié)構(gòu):
可知,cortex-M3內(nèi)核的尋址能力為32位,4G的空間,然 每個(gè)片子(stm32的) 用能夠用上多少?少.............
這里關(guān)心stm32的信息。
code 代碼的存放位置。
嵌入式閃存:閃存模塊--出自相關(guān)手冊(cè)這里關(guān)注主存儲(chǔ)快+信息快(系統(tǒng)存儲(chǔ)器+選擇字節(jié))大小,不同片型,大小不同。我們?cè)谀承┣闆r下讀寫flash,可操作主存儲(chǔ)塊的靠后的程序代碼用不到的一部分。
SRAM:靜態(tài)ramSTM32F103V8T6內(nèi)置64K字節(jié)的靜態(tài)SRAM。它可以以字節(jié)、半字(16位)或全字(32位)訪問。SRAM的起始地址是0x2000 0000。
所以,我們調(diào)試程序時(shí),能夠看到的變量地址均在這20K的范圍內(nèi)。0x2000 0000后邊的20k。
PERIPHERALS:片內(nèi)外設(shè)地址空間:0x4000 0000--0x4002 3400
下邊說說
IAR中使用.icf文件 劃分存儲(chǔ)資源設(shè)備:STM32F103V8T6-- ROM---64K RAM:20K
認(rèn)識(shí)IAR 開發(fā)環(huán)境下的.icf 文件: ----這篇文章可以當(dāng)做IAP下載方式下,帶外部SRAM的整個(gè)存儲(chǔ)資源規(guī)劃。
IAR 開發(fā)環(huán)境下使用 .icf文件定義 MCU及其外擴(kuò)資源的應(yīng)用范圍,這些在項(xiàng)目設(shè)計(jì)之前必須被確定下來。所以認(rèn)識(shí)它非常重要。那么該文件是如何定義的呢?
下面通過一個(gè).icf來認(rèn)識(shí)其具體結(jié)構(gòu):
這是一個(gè)基于STM32芯片的.icf文件定義結(jié)構(gòu):
/*###ICF###SectionhandledbyICFeditor,don'ttouch!****/
/*-Editorannotationfile-*/
/*IcfEditorFile="$TOOLKIT_DIR$configideIcfEditorcortex_v1_0.xml"*/
/*-Specials-*/
definesymbol__ICFEDIT_intvec_start__=0x08000000;/*中斷向量表開始地址*/
/*-MemoryRegions-*/
definesymbol__ICFEDIT_region_ROM_start__=0x08000000;/*閃存起始地址*/
definesymbol__ICFEDIT_region_ROM_end__=0x0800FFFF;/*閃存結(jié)束地址---flash大小64k*/
definesymbol__ICFEDIT_region_RAM_start__=0x20000000;/*SRAM起始地址*/
definesymbol__ICFEDIT_region_RAM_end__=0x20004FFF;/*SRAM結(jié)束地址---SRAM大小20k*/
/*-Sizes-*/
definesymbol__ICFEDIT_size_cstack__=0x800;/*棧大小*/
definesymbol__ICFEDIT_size_heap__=0x200;/*堆大小*/
/****EndofICFeditorsection.###ICF###*/
definememorymemwithsize=4G;
defineregionROM_region=mem:[from__ICFEDIT_region_ROM_start__to__ICFEDIT_region_ROM_end__];
defineregionRAM_region=mem:[from__ICFEDIT_region_RAM_start__to__ICFEDIT_region_RAM_end__];
defineblockCSTACKwithalignment=8,size=__ICFEDIT_size_cstack__{};//CSTACK塊屬性(8字節(jié)對(duì)齊、大小__ICFEDIT_size_cstack__)
defineblockHEAPwithalignment=8,size=__ICFEDIT_size_heap__{};
initializebycopy{readwrite};
donotinitialize{section.noinit};
placeataddressmem:__ICFEDIT_intvec_start__{readonlysection.intvec};//__ICFEDIT_intvec_start__賦值給.intvec標(biāo)識(shí)符
placeinROM_region{readonly};
placeinRAM_region{readwrite,
blockCSTACK,blockHEAP};
首先當(dāng)然要生成map文件了,注意IAR的默認(rèn)設(shè)置是不生成map文件的,我們需要手動(dòng)設(shè)置一下,如下圖,然后點(diǎn)擊準(zhǔn)備就緒之后編譯
(1)文件頭中顯示鏈接器版本,輸出文件名,MAP 文件名以及鏈接器命令行等。
(2)RUNTIME MODEL ATTRIBUTES 部份顯示 Endian等屬性;
(3) PLACEMENT SUMMARY部份顯示各sections 在存儲(chǔ)器中的分布;
(4)INIT TABLE 部份顯示與初始化有關(guān)的section tables;
(5)MODULE SUMMARY部份顯示所有被連接的文件信息,包括目標(biāo)文件和庫文件等;
(6)ENTRY LIST部份給出了所有函數(shù)的入口地址及其所在的目標(biāo)文件。
(7)文件尾中顯示了總的代碼和數(shù)據(jù)字節(jié)數(shù)(想看下最后目標(biāo)代碼占用多少Flash和多少RAM的可以從這里查到)。
看看總是好的.......