KEIL MAP文件分析

KEIL MAP文件提供了Size info、Total Info、Unused Section Info、Veneers Info、Symbols和Cross References等详细信息。它展示各.o文件在Code、RO Data、RW Data、ZI Data和Debug类型的空间占用,以及总统计和未使用的Section。此外,Veneers Info涉及ARM-Thumb Interworking的转换代码,Symbols包含本地和全局符号表,Cross References揭示段间的引用关系。Memory Map则展现了内存分布情况,而callgraph .htm文件提供了函数调用堆栈和子函数调用信息。


  1. Size info 功能:
    Object Name、Library Member Name、Library Name三大分类的各个.o文件(编译输出文件)所占用的
    Code类型、RO Data、RW Data、ZI Data、Debug类型所占用的空间
  2. 2014-01-23 11:05:20, 由  添加备注。
解析 Keil 工程生成的 `.map` 文件是理解程序内存布局、符号信息以及优化代码的重要手段。`.map` 文件详细记录了编译、链接过程中各个模块的分配信息,以及最终生成的可执行文件在内存中的分布情况。 ### 1. 内存布局分析 Keil 生成的 `.map` 文件中会有一个 **Memory Map** 部分,它描述了程序在 ROM 和 RAM 中的布局。通常包括以下几个关键段: - **Code (RO Code)**:表示程序的可执行代码部分,通常位于 ROM 或 Flash 中。 - **RO Data (Read-Only Data)**:只读数据段,如常量字符串或 const 变量,也位于 ROM 中。 - **RW Data (Read-Write Data)**:可读写数据段,位于 RAM 中,包含初始化值。 - **ZI Data (Zero-Initialized Data)**:未初始化的数据段,链接器会将其清零,不占用 ROM 空间,仅在运行时分配在 RAM 中。 例如,以下是一个典型的内存段分配情况: ```plaintext Execution Section Memory Map Type Addr Size Object(Section) RO Code 0x08000000 0x00000200 main.o(.text) RO Data 0x08000200 0x00000010 main.o(.rodata) RW Data 0x20000000 0x00000020 main.o(.data) ZI Data 0x20000020 0x00000100 main.o(.bss) ``` ### 2. 符号表分析 符号表(Symbols)部分列出了程序中定义和引用的所有函数和变量。包括: - **Local Symbols**:局部符号,仅在定义它们的模块内可见。 - **Global Symbols**:全局符号,可在整个项目中访问。 例如: ```plaintext Symbol Name Value Ov Type Module(Object) System_Initializes 0x08000100 Code main.o BSP_Initializes 0x08000120 Code bsp.o my_variable 0x20000000 Data main.o ``` 通过符号表可以追踪函数调用关系和变量地址,帮助进行调试和优化。 ### 3. 段交叉引用(Cross References) 该部分描述了各个段之间的引用关系。例如,`.text` 段可能引用了 `.rodata` 或 `.data` 段中的数据。这对于理解模块之间的依赖关系非常有用。 例如: ```plaintext Section Cross References: main.o(.text) refers to bsp.o(.text) for BSP_Initializes main.o(.text) refers to main.o(.data) for my_variable ``` ### 4. 未使用段信息(Unused Sections) 在优化过程中,链接器会移除未使用的代码段或数据段。这部分信息会列在 **Unused Section Info** 中,有助于识别冗余代码并进行清理。 例如: ```plaintext Removing Unused input sections from the image. foo.o(.text.unused_function) was removed ``` ### 5. 函数调用图(Callgraph) 在某些配置下,Keil 会生成一个 `.htm` 文件,展示函数调用图(Callgraph),显示函数之间的调用关系和堆栈使用情况。这有助于分析程序结构和优化性能。 ### 6. 总体信息(Total Info) 这部分汇总了整个工程的代码和数据大小,包括: - **Total RO Size**:ROM 中占用的只读数据和代码大小。 - **Total RW Size**:RAM 中占用的可读写数据大小。 - **Total ROM Size**:ROM 中实际占用的总大小(Code + RO Data + RW Data),因为 RW Data 的初始值需要存储在 ROM 中。 例如: ```plaintext Total RO Size (Code + RO Data) 0x00000210 Total RW Size (RW Data + ZI Data) 0x00000120 Total ROM Size (Code + RO Data + RW Data) 0x00000230 ``` ### 7. 配置选项对 Map 文件的影响 在 Keil IDE 中,可以通过 **Options for Target → Listing** 页面选择生成的 `.map` 文件内容。例如: - **Cross-Reference**:是否生成段交叉引用。 - **Symbols**:是否生成符号表。 - **Unused Sections**:是否记录未使用的段。 - **Veneers**:是否显示 ARM-Thumb 混合调用时插入的跳转代码。 勾选不同的选项会影响 `.map` 文件的详细程度。 ### 8. 示例分析 假设 `.map` 文件中有一段如下内容: ```plaintext main.o(i.System_Initializes) refers to bsp.o(i.BSP_Initializes) ``` 这表明 `main.c` 中的 `System_Initializes` 函数调用了 `bsp.c` 中的 `BSP_Initializes` 函数[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值