IAR分析内存重要的神器 - map文件全解析

0.gif

对于使用RTOS进行项目开发的朋友可能会有这样的疑惑,我创建的任务到底需要多大的堆栈空间才够呢?

其实,除了使用RTOS开发,就是使用裸机进行开发的朋友同样也会遇到类似的问题,有些地方需要很大的堆栈,对系统堆栈的分配就有必要知道其大小,如果分配不充分,很有可能导致内存溢出。

之前就有小伙伴问:我的代码经常运行到“HardFault_Handler”、 “MemManage_Handler”异常中断里面去了,是什么原因导致的呢?

当我们遇到内存溢出现象时,查看map文件,很快就能找到那些代码占用了多少空间

还有很多小伙伴问:我代码、内存占用的资源如何查看呢?当你们了解了map文件里面的内容,以上问题就一目了然了。


输出map配置

在工程中,默认是输出了map文件,如果没有输出,需要如下配置:

0?wx_fmt=png

当按照上面配置勾选了“生产map”文件,就可以看到如下情况:

0?wx_fmt=png

下面才是重点,就让我给大家详细讲述一下IAR中map文件的重要内容。map文件主要分为六大块,详情见下面章节。

Ⅰ、MAIN INIF

Ⅱ、RUNTIME MODEL ATTRIBUTES

Ⅲ、PLACEMENT SUMMARY

Ⅳ、INIT TABLE

Ⅴ、MODULE SUMMARY

Ⅵ、ENTRY LIST

MAIN INIF主要信息

0?wx_fmt=png

这段信息比较简单,关于map文件的主要信息。包含:IAR版本、日期、输出文件路径、map文件路径等。

RUNTIME MODEL ATTRIBUTES

0?wx_fmt=png

RUNTIME MODEL ATTRIBUTES:运行时MODEL属性。这部分显示相关属性等信息,可以不用深入理解。

PLACEMENT SUMMARY

0?wx_fmt=png

PLACEMENT SUMMARY:概述位置,即各Section(段)存储的位置。

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,类型为intvec(初始化向量);

"P1"段位于0x08000000 至 0x0801ffff区域,类型为ro;

"P2"段位于0x20000000 至0x20004fff区域,类型包含:rw, block CSTACK, block HEAP;

2.详细说明

Section  Kind    Address   Size   Object

段          类型        地址     大小    目标位置

"A0":                          0xec

  .intvec   ro code  0x08000000  0xec  startup_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

0?wx_fmt=png

INIT TABLE:初始化表,类似于上面第三部分内容,这里是针对RAM存储地址。

MODULE SUMMARY

0?wx_fmt=png

MODULE SUMMARY:概述模块,主要概述文件于库(模块)所占ro代码大小、rw数据大小。

ENTRY LIST

0?wx_fmt=png

ENTRY LIST:入口列表,包含函数、变量等入口地址。

其中Entry(入口)主要包含两大类:函数和变量。

函数:全局函数、静态函数

变量:全局变量、(文件内)静态变量、(函数内)静态变量

入口              地址        大小   类型     目标

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]

从上面列表的差异可以看到出来主要包含五类:

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函数体内。

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

相信大家都会明白,信息就是所有代码、内存块汇总的。而这条信息也会在编译窗口中显示出来。


微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,在我的底部菜单查看更多精彩内容!

0?wx_fmt=jpeg

长按识别二维码 关注

如果对你们有用就点个赞 点下广告支持下吧!

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: IAR中文用户手册-官方版是IAR Systems AB公司为了方便使用中文语言的用户而编写的一份指导手册。该手册详细介绍了IAR嵌入式开发环境的面使用方法,包括IAR Embedded Workbench(IAR嵌入式工作台)的使用、嵌入式应用程序开发的各种方法、IAR编译器的使用技巧以及调试和测试策略等等。 该手册共分为12章,包括环境概述、项目和解决方案、菜单栏、工具栏、设计器、编译指令、编译器调试功能、调试器、内存区分配、性能指示器和调试器扩展功能等共12个方面,涵盖了IAR嵌入式开发环境的面知识点。 该手册适合于嵌入式开发人员、学生、教师以及对嵌入式开发感兴趣的用户使用。在使用该手册的同时,用户还可以从IAR Systems AB公司提供的其他相关资源中获取更多的技术支持和帮助,如在线技术支持、社区论坛等。 总之,通过IAR中文用户手册-官方版,用户可以深入了解IAR嵌入式开发环境的使用,提高开发效率,更好地完成嵌入式应用程序的开发和测试工作。 ### 回答2: IAR中文用户手册是一份官方版的手册,旨在为使用IAR软件的中文用户提供详细的操作指南和参考资料。该手册内容面,覆盖了从安装、配置、编译到调试的整个流程。用户可以通过该手册了解如何使用IAR工具链进行代码开发,并且掌握各种编程技巧和调试方法。 该手册分为多个章节,每个章节都对应一个特定的主题,例如,安装与配置、编译及链接、软件调试、存储器管理、时钟与电源管理、优化技巧等。每个章节都逐步展示了相关操作的流程,并提供了相应的参考资料和实例。此外,该手册还包含了丰富的插图和图表,以协助用户更好地理解各个操作步骤和原理。 总的来说,IAR中文用户手册是一份非常有用的参考资料,可以帮助开发人员更好地了解IAR工具链的使用方法,提高开发效率和程序质量。对于需要开发嵌入式软件的企业和个人而言,该手册是一份必不可少的参考资料,可以为他们带来无限的帮助和收益。 ### 回答3: IAR中文用户手册-官方版是一个关于IAR Embedded Workbench的详细说明书,内容涵盖了从安装软件到创建、编译、调试、下载、优化各个方面的操作指南,帮助用户更好地使用该软件开发嵌入式应用程序。 IAR Embedded Workbench是一款面向嵌入式系统的软件开发环境,目的是为开发者提供一种高效、可靠的程序开发工具。用户手册将IAR Embedded Workbench中的关键概念、命令、示例和实用技巧详细介绍,旨在让用户更好地理解和掌握该软件的使用方法。 本中文用户手册包含了大量的示例和截图,让用户可以直观地了解每一步操作的具体过程,同时也提供了一些实用的技巧,例如如何使用调试工具进行调试、如何使用代码优化工具提升程序性能等。此外,用户手册还涵盖了IAR Embedded Workbench的高级功能,如使用C-SPY进行源代码调试、使用RTT进行实时跟踪等,让开发者能够更面、深入地了解和掌握该软件的使用方法。 总之,IAR中文用户手册-官方版为IAR Embedded Workbench的用户提供了一个面、详细的使用指南,有助于他们更好地利用这个软件提高开发效率,开发高质量的嵌入式系统。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strongerHuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值