IAR中map檔案全解析

2022-09-22 19:48:10 字數 3094 閱讀 2256

iar中map檔案全解析。

對於使用rtos進行專案開發的朋友可能會有這樣的疑惑,我建立的任務到底需要多大的堆疊空間才夠呢?

其實,除了使用rtos開發,就是使用裸機進行開發的朋友同樣也會遇到類似的問題,有些地方需要很大的堆疊,對系統堆疊的分配就有必要知道其大小,如果分配不充分,很有可能導致記憶體溢位。

之前就有小夥伴問:我的**執行到「hardfault_handler」、 「memmanage_handler」異常中斷裡面去了,是什麼原因導致的呢?

當我們遇到記憶體溢位現象時,檢視map檔案,很快就能找到那些**占用了多少空間。

還有很多小夥伴問:我**、記憶體占用的資源如何檢視呢?當你們了解了map檔案裡面的內容,以上問題就一目了然了。

輸出map配置

在工程中,預設是輸出了map檔案,如果沒有輸出,需要如下配置:

當按照上面配置勾選了「生產map」檔案,就可以看到如下情況:

下面才是重點,就讓我給大家詳細講述一下iar中map檔案的重要內容。map檔案主要分為六大塊,詳情見下面章節。

ⅰ、main inif

ⅱ、runtime model attributes

ⅲ、placement summary

ⅳ、init table

ⅴ、module summary

ⅵ、entry list

這段資訊比較簡單,關於map檔案的主要資訊。包含:iar版本、日期、輸出檔案路徑、map檔案路徑等。

runtime model attributes:執行時model屬性。這部分顯示相關屬性等資訊,可以不用深入理解。

placementsummary:概述位置,即各section(段)儲存的位置。

1.總體概述

"a0": place at 0x08000000 ;

"p1": place in [from 0x08000000 to 0x0801ffff] ;

"p2": place in [from 0x20000000 to 0x20004fff] ;

意思是:

"a0"段位於0x08000000,型別為intvec(初始化向量);

"p1"段位於0x08000000 至 0x0801ffff區域,型別為ro;

"p2"段位於0x20000000 至0x20004fff區域,型別包含:rw, block cstack, block heap;

2.詳細說明

section kindaddress size object

段 型別 位址 大小 目標位置

"a0": 0xec

.intvecro code 0x08000000 0xecstartup_stm32f10x_md.o [1]

- 0x080000ec 0xec

意思是:

"a0"段總共大小為0xec;

其中「.intvec」段型別為ro,位址0x08000000,大小0xec,位於

startup_stm32f10x_md檔案;

"a0"段結束位址為0x080000ec,總共大小0xec。

提示:段與型別一般有對應關係

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資料)

"p2":

.data inited(已初始化資料)

.bss zero(未初始化資料 零)

init table:初始化表,類似於上面第三部分內容,這裡是針對ram儲存位址。

module summary:概述模組,主要概述檔案於庫(模組)所佔ro**大小、rw資料大小。

entry list:入口列表,包含函式、變數等入口位址。

其中entry(入口)主要包含兩大類:函式和變數。

函式:全域性函式、靜態函式

變數:全域性變數、(檔案內)靜態變數、(函式內)靜態變數

入口 位址 大小 型別 目標

entry address sizetype object

main 0x08000317 0x5e code gb main.o [1]

setsysclock 0x08000141 0x8 code lc system_stm32f10x.o

**ar 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]

從上面列表的差異可以看到出來主要包含五類:

1.「全域性」函式

入口:main,為全域性函式介面;

位址:0x08000317,代表儲存在flash;

大小:0x5e,該入口函式大小為0x5e;

型別:code gb,其中code說明為**,gb說明為「全域性的」函式(global);

目標:main.o,該入口函式位於main.c檔案下面。

2.「靜態」函式

靜態函式也就是在函式前加「static」.

setsysclock位於system_stm32f10x.c檔案下,可以看到前面加了「static」。

型別為code lc,即靜態(區域性local)函式;

3.全域性變數

全域性變數也叫「全域性資料」,因為它的型別為「data gb」。

從位址0x20000000可以看得出,它是位於ram區域,也就是記憶體中。

(提示:只有全域性和靜態的變數才會在編譯之後決定在ram中的位址,定義在函式體裡面的區域性變數只有在程式執行時才會分配位址,也就是說區域性變數位於堆疊中)。

4.(檔案內)靜態變數

使用static關鍵字定義的變數,只有在當前檔案內使用,所以它屬於靜態(「區域性」local)變數。

5.(函式內)靜態變數

它和「(檔案內)靜態變數」類似,屬於靜態變數,只是它定義在函式體內的。

從入口「main::svar_i」可以看得出,變數svar_i定義在main函式體內。

C C 標頭檔案全解析

include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 include 定義各種資料型別最值常量 include 定義本地化函式 include ...

IAR中ICF檔案分析與應用

原文 sections在位址空間中的存放是由ilink鏈結器來實現的,而ilink鏈結器是按照使用者在icf檔案中的規定來放置sections的,所以理 解icf檔案的內容尤其重要。乙個標準的icf檔案可包括下面這些內容 1.可編址的儲存空間 memory 2.不同的儲存器位址區域 region 3...

IAR中ICF檔案分析與應用

sections在位址空間中的存放是由ilink鏈結器來實現的,而ilink鏈結器是按照使用者在icf檔案中的規定來放置sections的,所以理 解icf檔案的內容尤其重要。乙個標準的icf檔案可包括下面這些內容 1.可編址的儲存空間 memory 2.不同的儲存器位址區域 region 3.不同...