對(duì)于使用RTOS進(jìn)行項(xiàng)目開(kāi)發(fā)的朋友可能會(huì)有這樣的疑惑,我創(chuàng)建的任務(wù)到底需要多大的堆棧空間才夠呢?
其實(shí),除了使用RTOS開(kāi)發(fā),就是使用裸機(jī)進(jìn)行開(kāi)發(fā)的朋友同樣也會(huì)遇到類(lèi)似的問(wèn)題,有些地方需要很大的堆棧,對(duì)系統(tǒng)堆棧的分配就有必要知道其大小,如果分配不充分,很有可能導(dǎo)致內(nèi)存溢出。
之前就有小伙伴問(wèn):我的代碼經(jīng)常運(yùn)行到“HardFault_Handler”、 “MemManage_Handler”異常中斷里面去了,是什么原因?qū)е碌哪兀?/p>
當(dāng)我們遇到內(nèi)存溢出現(xiàn)象時(shí),查看map文件,很快就能找到那些代碼占用了多少空間。
還有很多小伙伴問(wèn):我代碼、內(nèi)存占用的資源如何查看呢?當(dāng)你們了解了map文件里面的內(nèi)容,以上問(wèn)題就一目了然了。
輸出map配置
在工程中,默認(rèn)是輸出了map文件,如果沒(méi)有輸出,需要如下配置:
當(dāng)按照上面配置勾選了“生產(chǎn)map”文件,就可以看到如下情況:
下面才是重點(diǎn),就讓我給大家詳細(xì)講述一下IAR中map文件的重要內(nèi)容。map文件主要分為六大塊,詳情見(jiàn)下面章節(jié)。
Ⅰ、MAIN INIF
Ⅲ、PLACEMENT SUMMARY
Ⅳ、INIT TABLE
Ⅴ、MODULE SUMMARY
Ⅵ、ENTRY LIST
Ⅰ
MAIN INIF主要信息
這段信息比較簡(jiǎn)單,關(guān)于map文件的主要信息。包含:IAR版本、日期、輸出文件路徑、map文件路徑等。
Ⅱ
RUNTIME MODEL ATTRIBUTES
RUNTIME MODEL ATTRIBUTES:運(yùn)行時(shí)MODEL屬性。這部分顯示相關(guān)屬性等信息,可以不用深入理解。
Ⅲ
PLACEMENT SUMMARY
PLACEMENT SUMMARY:概述位置,即各Section(段)存儲(chǔ)的位置。
1.總體概述
"A0": place at 0x08000000 { ro section .intvec };
"P1": place in [from 0x08000000 to 0x0801ffff] { ro };
"P2": place in [from 0x20000000 to 0x20004fff] { rw, block CSTACK, block HEAP };
意思是:
"A0"段位于0x08000000,類(lèi)型為intvec(初始化向量);
"P1"段位于0x08000000 至 0x0801ffff區(qū)域,類(lèi)型為ro;
"P2"段位于0x20000000 至0x20004fff區(qū)域,類(lèi)型包含:rw, block CSTACK, block HEAP;
2.詳細(xì)說(shuō)明
Section Kind Address Size Object
段 類(lèi)型 地址 大小 目標(biāo)位置
"A0": 0xec
.intvec ro code 0x08000000 0xec startup_stm32f10x_md.o [1]
- 0x080000ec 0xec
意思是:
"A0"段總共大小為0xec;
其中“.intvec”段類(lèi)型為ro,地址0x08000000,大小0xec,位于
startup_stm32f10x_md文件;
"A0"段結(jié)束地址為0x080000ec,總共大小0xec。
提示:
段與類(lèi)型一般有對(duì)應(yīng)關(guān)系
Section Kind
"A1":
.intvec ro code(ro代碼)
"P1":
.text ro code(ro代碼)
.rodata const (常量)
CODE ro code(ro代碼)
.iar.init_table const(常量)
Initializer bytes ro data(ro數(shù)據(jù))
"P2":
.data inited(已初始化數(shù)據(jù))
.bss zero(未初始化數(shù)據(jù) 零)
Ⅳ
INIT TABLE
INIT TABLE:初始化表,類(lèi)似于上面第三部分內(nèi)容,這里是針對(duì)RAM存儲(chǔ)地址。
Ⅴ
MODULE SUMMARY
MODULE SUMMARY:概述模塊,主要概述文件于庫(kù)(模塊)所占ro代碼大小、rw數(shù)據(jù)大小。
Ⅵ
ENTRY LIST
ENTRY LIST:入口列表,包含函數(shù)、變量等入口地址。
其中Entry(入口)主要包含兩大類(lèi):函數(shù)和變量。
函數(shù):全局函數(shù)、靜態(tài)函數(shù)
變量:全局變量、(文件內(nèi))靜態(tài)變量、(函數(shù)內(nèi))靜態(tài)變量
入口 地址 大小 類(lèi)型 目標(biāo)
Entry Address Size Type Object
main 0x08000317 0x5e Code Gb main.o [1]
SetSysClock 0x08000141 0x8 Code Lc system_stm32f10x.o
gVar 0x20000000 0x4 Data Gb main.o [1]
sVar_E 0x20000004 0x4 Data Lc main.o [1]
main::sVar_I 0x20000008 0x4 Data Lc main.o [1]
從上面列表的差異可以看到出來(lái)主要包含五類(lèi):
1.“全局”函數(shù)
入口:main,為全局函數(shù)接口;
地址:0x08000317,代表存儲(chǔ)在FLASH;
大小:0x5e,該入口函數(shù)大小為0x5e;
類(lèi)型:Code Gb,其中code說(shuō)明為代碼,Gb說(shuō)明為“全局的”函數(shù)(Global);
目標(biāo):main.o,該入口函數(shù)位于main.c文件下面。
2.“靜態(tài)”函數(shù)
靜態(tài)函數(shù)也就是在函數(shù)前加“static”.
SetSysClock位于system_stm32f10x.c文件下,可以看到前面加了“static”。
類(lèi)型為Code Lc,即靜態(tài)(局部Local)函數(shù);
3.全局變量
全局變量也叫“全局?jǐn)?shù)據(jù)”,因?yàn)樗念?lèi)型為“Data Gb”。
從地址0x20000000可以看得出,它是位于RAM區(qū)域,也就是內(nèi)存中。
(提示:只有全局和靜態(tài)的變量才會(huì)在編譯之后決定在RAM中的地址,定義在函數(shù)體里面的局部變量只有在程序運(yùn)行時(shí)才會(huì)分配地址,也就是說(shuō)局部變量位于堆棧中)。
4.(文件內(nèi))靜態(tài)變量
使用static關(guān)鍵字定義的變量,只有在當(dāng)前文件內(nèi)使用,所以它屬于靜態(tài)(“局部”Local)變量。
5.(函數(shù)內(nèi))靜態(tài)變量
它和“(文件內(nèi))靜態(tài)變量”類(lèi)似,屬于靜態(tài)變量,只是它定義在函數(shù)體內(nèi)的。
從入口“main::sVar_I”可以看得出,變量sVar_I定義在main函數(shù)體內(nèi)。
map文件的最后有如下一段信息:
[1] = C:\Users\Administer\Desktop\Demo\Debug\Obj
[2] = command line
[3] = dl7M_tln.a
[4] = m7M_tls.a
[5] = rt7M_tl.a
[6] = shb_l.a
130 157 bytes of readonly code memory
18 736 bytes of readonly data memory
121 508 bytes of readwrite data memory
Errors: none
Warnings: none
相信大家都會(huì)明白,信息就是所有代碼、內(nèi)存塊匯總的。而這條信息也會(huì)在編譯窗口中顯示出來(lái)。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3108瀏覽量
74987 -
IAR
+關(guān)注
關(guān)注
5文章
370瀏覽量
37245 -
RTOS
+關(guān)注
關(guān)注
24文章
841瀏覽量
120758 -
MAP
+關(guān)注
關(guān)注
0文章
49瀏覽量
15412
發(fā)布評(píng)論請(qǐng)先 登錄
飛凌嵌入式ElfBoard ELF 1板卡-uboot編譯system.map/uboot.map
基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量內(nèi)存布局優(yōu)化精控方法

S32G3有沒(méi)有辦法從.map文件確定SRAM使用情況?
IAR無(wú)法跳轉(zhuǎn)定義,系統(tǒng)庫(kù)文件文件名后有[RO]是怎么回事?
FPD-link裕量分析程序(MAP)用戶(hù)指南

如何獲取入口函數(shù)不是__iar_program_start的Program entry的stack使用情況

HBM與GDDR內(nèi)存技術(shù)全解析

深入解析Tricore的Tasking鏈接文件

CAN底層報(bào)文抓到了,卻不知怎么解析?以及如何看到信號(hào)運(yùn)行狀態(tài)?

評(píng)論