推荐

分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang

推荐在我的公众号「strongerHuang」或网站(www.strongerhuang.com)阅读以下教程:
1.EWSTM8系列教程01_IAR介绍、下载、安装和注册
2.EWSTM8系列教程02_新建基础软件工程
3.EWSTM8系列教程03_主窗口、工具栏的概述
4.EWSTM8系列教程04_菜单概述(一)
5.EWSTM8系列教程05_菜单概述(二)
6.EWSTM8系列教程06_工程节点选项配置(一)
7.EWSTM8系列教程07_工程节点选项配置(二)
8.EWSTM8系列教程08_IDE选项配置(一)
9.EWSTM8系列教程09_IDE选项配置(二)
10.EWSTM8系列教程10_一个工程添加多个节点
11.EWSTM8系列教程11_一个工作空间添加多个工程
12.EWSTM8系列教程12_IAR文件类型描述
···

写在前面

作者:strongerHuang

版权所有,未经允许,禁止用于其它商业用途!!!

对于使用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

Ⅰ、MAIN INIF主要信息

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

Ⅱ、RUNTIME MODEL ATTRIBUTES

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

Ⅲ、PLACEMENT SUMMARY

PLACEMENTSUMMARY:概述位置,即各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

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

Ⅴ、MODULE SUMMARY

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

Ⅵ、ENTRY LIST

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

为方便大家阅读,本文内容已经整理成PDF文件:

http://pan.baidu.com/s/1o76J9xg

Ⅶ、最后

我的网站:https://www.strongerhuang.com

我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号。

微信公众号

IAR中map文件全解析相关推荐

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

    " 对于使用RTOS进行项目开发的朋友可能会有这样的疑惑,我创建的任务到底需要多大的堆栈空间才够呢? 其实,除了使用RTOS开发,就是使用裸机进行开发的朋友同样也会遇到类似的问题,有些地方需 ...

  2. Ol3中Map事件全解析

    Ol3中Map事件全解析 本文将粗略对ol3 基本地图事件进行研究. 地图点击事件 singleclick:地图单击事件. dblclick:地图双击事件. click:地图点击事件. 测试 map. ...

  3. Keil综合(03)map文件全解析

    相关标题:Keil map文件 内存分布文件 0.写在前面 相信有较大项目开发经验的朋友都曾遇到内存溢出的问题,那么大家都是如何分析这类问题的呢?大家遇到HardFault_Handler 有对map ...

  4. Java中的泛型全解析(二)

    Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...

  5. C/C++头文件全解析

    C/C++头文件全解析 #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h&g ...

  6. 慕容小匹夫 Unity3D移动平台动态读取外部文件全解析

    Unity3D移动平台动态读取外部文件全解析 c#语言规范 阅读目录 前言: 假如我想在editor里动态读取文件 移动平台的资源路径问题 移动平台读取外部文件的方法 补充: 回到目录 前言: 一直有 ...

  7. 匹夫细说Unity3D(一)——移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖总结成一套相同 问题 的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大 ...

  8. Java中的泛型全解析(一)

    为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求 ...

  9. Java中Xml文件的解析

    开发中比较常见的解析方式有三种,如下: 1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象. a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作. b)  ...

最新文章

  1. oracle导入索引b报错,impdp导入索引很慢
  2. Spring中的事务管理详解
  3. 微信 php 接口 函数,PHP的json_encode函数应用到微信接口有关问题(include \uxxxx will create fail)...
  4. Eclipse非常有用的快捷键
  5. Thinkpad在Windows8上热键的解决方案
  6. 输入一个三位整数,求出该数字各个位的数字之和
  7. 《关于Win10系统下Oculus Senser USB无法识别的问题》
  8. viper4android 魅族6,手机资讯导报:魅族自曝新旗舰PRO6摄像头不凸起
  9. JAVA(时间对比排序程序)
  10. VISTA中注册表项LEGACY_****的删除--另一种方法:使用psExec
  11. 21天jmeter打卡 day1
  12. 如何读取二进制图片-.ashx一般处理程序
  13. 全网首发:首个安卓摄像头预览加显示的项目
  14. 专家解读政府购买服务热点
  15. 试图加载格式不正确的程序。 (Exception from HRESULT: 0x8007000B)
  16. Muti-Barrage 一个多功能的Android弹幕库
  17. royer推挽自激电路
  18. git更换远程仓库和用户名密码
  19. Linux C/C++ 调试的那些“歪门邪道”
  20. 线性空间,线性子空间,基与维数

热门文章

  1. 使用springboot写一个记事小账本
  2. linux关于消息队列中消息的大小的限制
  3. CAD编辑工具中如何查找图纸中的坐标点的位置
  4. 斗地主(代码简易版)
  5. html5 树叶飘落,使用Html5实现树叶飘落的效果
  6. 疫情放开后,如何保护居家员工的办公安全?
  7. Word 设置标题编号
  8. 原生前端实现响应式个人简历网站设计(附源码)
  9. 并行与并发的区别,一瞬间就能理解并记住
  10. HCIP-DATACOM H12-831(1-20)