0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

黄工的嵌入式威廉希尔官方网站 圈 来源:黄工的嵌入式威廉希尔官方网站 圈 2020-03-14 14:19 次阅读

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

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

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    3020

    浏览量

    74009
  • IAR
    IAR
    +关注

    关注

    5

    文章

    350

    浏览量

    36669
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119598
  • MAP
    MAP
    +关注

    关注

    0

    文章

    49

    浏览量

    15137
收藏 人收藏

    评论

    相关推荐

    FPD-link裕量分析程序(MAP)用户指南

    电子发烧友网站提供《FPD-link裕量分析程序(MAP)用户指南.pdf》资料免费下载
    发表于 11-26 15:49 0次下载
    FPD-link裕量<b class='flag-5'>分析</b>程序(<b class='flag-5'>MAP</b>)用户指南

    如何获取入口函数不是__iar_program_start的Program entry的stack使用情况

    问题 IAR中默认的入口函数是__iar_program_start,使能stack usage analysis之后: 生成的map文件中STACK USAGE章节里面会包含Prog
    的头像 发表于 11-25 16:23 165次阅读
    如何获取入口函数不是__<b class='flag-5'>iar</b>_program_start的Program entry的stack使用情况

    HBM与GDDR内存威廉希尔官方网站 解析

    在高性能图形处理领域,内存威廉希尔官方网站 起着至关重要的作用。本文介绍两种主要的图形内存威廉希尔官方网站 :高带宽内存(HBM)和图形双倍数据速率(GDDR),它们在架构、性能特性和应用场景上各有千秋。通过对比
    的头像 发表于 11-15 10:47 867次阅读
    HBM与GDDR<b class='flag-5'>内存</b>威廉希尔官方网站
<b class='flag-5'>全</b><b class='flag-5'>解析</b>

    深入解析Tricore的Tasking链接文件

    目录 1.链接文件有什么用? 2.文件结构和语法解析 2.1 文件结构 2.2 语法解析 3.小结 玩惯了ld
    的头像 发表于 11-12 16:31 454次阅读
    深入<b class='flag-5'>解析</b>Tricore的Tasking链接<b class='flag-5'>文件</b>

    CAN底层报文抓到了,却不知怎么解析?以及如何看到信号运行状态?

    本文介绍CAN总线中DBC文件重要性及ZCANPRO如何实现DBC解析、数据发送和实时曲线分析,帮助您更有效地分析和利用CAN总线数据。在
    的头像 发表于 09-30 08:05 1094次阅读
    CAN底层报文抓到了,却不知怎么<b class='flag-5'>解析</b>?以及如何看到信号运行状态?

    PCBA加工流程解析:电子制造的关键环节

    成成品产品的重要任务。本文将详细介绍PCBA加工的流程,从设计到成品,逐步解析每个环节的工艺和关键步骤。 PCBA加工电子制造的关键环节流程解析
    的头像 发表于 09-18 09:51 603次阅读

    什么是内存通道威廉希尔官方网站

    内存通道威廉希尔官方网站 作为计算机系统中的核心组成部分,对于提升数据处理能力、优化系统性能以及增强系统的稳定性与扩展性等方面发挥着至关重要的作用。以下是对内存通道威廉希尔官方网站 作用的详细阐述,旨在通过多个方面解析
    的头像 发表于 09-04 12:47 595次阅读

    内存时钟是什么意思

    内存时钟是内存模块中一个至关重要的参数,它直接关联到内存模块能够工作的最高频率。以下是对内存时钟的详细
    的头像 发表于 09-04 11:45 1212次阅读

    使用GD32E230X8通过IAR仿真出现outside FLASH问题怎么解决?

    是0x8000000~0x800ffff,大小为64k,IAR上的icf文件设置地址也是正确,map文件中程序写到地址0x800\'449c,剩余0xbb64
    发表于 07-26 08:30

    内存的种类都有哪些?有什么区别?

    内存,作为计算机中不可或缺的组成部分,承担着存储和交换数据的重要任务。随着威廉希尔官方网站 的不断发展,内存的种类也日益丰富,每种类型都有其独特的特点和适用场景。以下是对内存种类及其区别的详细
    的头像 发表于 07-15 18:15 1.1w次阅读

    示波器文件存储方式介绍

    示波器作为电子测试领域的重要工具,其功能不仅限于实时显示和分析电信号波形,还涉及到数据的存储和导出。随着威廉希尔官方网站 的发展,示波器提供了多种文件存储方式,以满足不同应用场景下的数据保存需求。本文将详细
    的头像 发表于 05-29 17:08 1142次阅读

    求助,关于STM8S IAR写程序内存的问题求解

    这是IAR编译之后的代码大小,在网上查了一下,对这三个的存储地址众说纷纭,一致的说法是内存大小等于这三个相加,所以向各位前辈请教这三个的储存地址和程序的总大小,因为用的STM8S003内存只有8K
    发表于 05-22 08:21

    stvd无法生成map文件怎么解决?

    用stvd 4.3.12,为什么我新建的工程生活生成不了map文件(已经在project setting->linker->ouput里选择了General Map
    发表于 04-29 09:01

    IAR FOR ARM和IAR FOR STM8无法共存怎么解决?

    Files (x86)IAR SystemsEmbedded Workbench 8.1文件夹里 安装完后,FOR STM8在C:Program Files (x86)IAR
    发表于 04-07 07:39

    如何查看GD32 Keil和IAR工程的map文件

    文件会有很多信息,比如函数地址及所占空间大小、变量地址及所占用空间大小、栈顶指针、整个工程所占用的flash和RAM空间大小等等。在进行代码分析时,map文件
    的头像 发表于 01-27 09:30 2601次阅读
    如何查看GD32 Keil和<b class='flag-5'>IAR</b>工程的<b class='flag-5'>map</b><b class='flag-5'>文件</b>