由map文件知道rom、ram的使用情况

作者: manhuami2007
上传时间为: 2016-11-22 03:52 PM
2016-11-22
阅读:

以keil生成stm32的程序为例,IDE会生成一个xxx.map文件,这个文件能告诉我们很多信息,这次探讨怎么从map文件中知道程序在ROM中的大小和在RAM中的大小。

在map文件的后面有一项Image component sizes指出了固件中各组件的大小,见下图

首先讲解横向各参数的意思:

  • Code (inc.data):指出程序的编码所占字节数,本例中有3712字节。inc.data指这3712字节中含有1580字节的inline data,inline data含文字池(literal pools)和短字符串(short strings)
  • RO Data:只读数据所占字节数,这是指除了inc.data之外其它的只读数据
  • RW Data:可读写数据所占字节数
  • ZI Data:初始化为零的可读写数据(zero init data)所占字节数,这些数据指我们自己定义的数据结构声明的变量,并且没有赋初值的全局变量、静态变量。这些变量为ZI Data。我们定义的int、float这些C语言定义的数据结构的全局/静态未赋初值变量并不会归到ZI Data中
  • Debug:debug数据所占字节数

纵向各参数的意思:

  • Object Totals:各目标(objects)连接到一起的固件(image)所占字节
  • (incl.Generated):armlink生成的固件内容信息,比如region tables。region tables包含一些固件信息,比如在RAM中ZI Data的初始化信息。
  • Library Totals:引用的C语音库函数所占的字节数,其作为独立的目标(objects)引入固件中
  • (incl.Padding):armlink插入的占位符(padding)的字节数。占位符是用于对齐数据的
  • Grand Totals:固件的真实大小,即将程序与库的数据相加
  • ELF Image Totals:如果使用了RW数据压缩来优化占用ROM大小,那么数值就反应到这项
  • ROM Totals:指出包含固件所需的最小ROM大小。这里不含ZI Data和Debug数据,这些数据不存到ROM中

那么都有什么数据存到ROM中:

  1. Code
  2. RW Data
  3. RO Data

什么数据存到RAM中:

  1. RW Data
  2. ZI Data

为什么RW Data也会存到ROM中?

因为各变量的信息也需要烧些到ROM中,才能在初始化的时候知道这些RW Data的值

那么ZI Data又是如何初始化的,为什么不用存到ROM中?

ZI Data是通过上文提到的Region Table初始化的,这个表中含有一个RAM的起始地址与终止地址,初始化的时候将这个范围内的数据都初始化为0

那么这些数据是在什么时候初始化的,为什么程序中看不到初始化过程?

以stm32为例,系统上电进入Reset函数之后初始化时钟源,之后就要进入main函数,但是在初始化时钟源与进入main函数之间有一段代码是初始化C语言环境的,在这部分代码中会在RAM中初始化各种变量。这部分代码是编译器负责生成的。

所以上图中的程序使用的ROM大小为Code+RW Data+RO Data = 25960 。使用的RAM大小为RW Data+ZI Data = 10548

相关经验
全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示