查看: 3592|回复: 0

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

[复制链接]
  • TA的每日心情
    慵懒
    2016-11-22 11:58
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-11-22 15:52:55 | 显示全部楼层 |阅读模式
    分享到:
    以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中:

    • Code
    • RW Data
    • RO Data
    什么数据存到RAM中:

    • RW Data
    • 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
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 18:00 , Processed in 0.104082 second(s), 14 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.