ARM map(Program size)
1.Keil程式编译完之后,在List目录下会生成一个.map文件,里面包含各个存储块数据大小.
Code:ARM 指令.
RO(Read only)只读数据,如const int gu8test = 1;
RW(Read write)可读写数据,就是我们常说的变量,已经被初始的变量才是RW; eg: uint8_t gu8Test = 1;
ZI:Zero Init数据,就是不初始化,或者用0初始化的变量.
PS:不管是(RW / ZI) data申明之后,如果没有使用,不会占用RAM空间!!!

PS:当额外增加的字节数,如果不满4倍数,会按4倍数自动对齐,假设增加10byte(4 + 4 + 2),但实际会使用到12byte.
另外,当增加RW data时(不管增加几byte),ZI Size都会减少4byte,怪怪的,还没理清???
各个部分介绍:
ARM程序的组成
此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的bin/Hex映像(image)文件,这一点清注意区别.
一个ARM程序包含3部分:RO,RW and ZI;
RO是程序中的指令和常量;
RW是程序中的已初始化变量;
ZI是程序中的未初始化的变量.
由以上3点说明可以理解为:RO就是readonly , RW就是read/write , ZI就是zero.
ARM映像文件的组成
所谓ARM映像文件就是指烧录到ROM中的bin/Hex文件,也称为image文件.
Image文件包含了RO和RW数据,之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可.
Q:为什么Image中必须包含RO和RW?
A:因为RO中的指令和常量无法像ZI那样无中生有(断电会丢失),掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢?是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可.包含进去反而浪费存储空间!!!
ARM程序的执行过程
从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的.因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的.
实际上,RO中的指令至少应该有这样的功能:
1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中.
2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零.ZI中也是变量,同理:变量不能存在ROM中
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量.否则只能运行不含变量的代码.
参考几份博友写的文章.
http://anlx27.iteye.com/blog/1575848
http://www.mamicode.com/info-detail-1043059.html
http://limountain.blog.163.com/blog/static/478044492012311956956/
http://wenku.baidu.com/link?url=XLeK2pknOFaktA1vc9ojERVKUagsLX7A6h2R06ZNcwF7si-DfNHx8Y7goxycWRrfzTOjaW93lNFErTl3EjTQ8gEo0UAloEFWu0Slhhq4YsC
ARM编译空间属性介绍:
1. 程序的空间属性
一般情况下,一个程序本质上都是由 bss段 & data段 & text段 三个组成的——本概念是当前的计算机程序设计中是很重要的一个基本概念.
而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题!!!
BSS段: BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称,BSS段属于静态内存分配.
数据段: 数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域,数据段属于静态内存分配.
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域,这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序.在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等!!!
堆(heap): 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减.当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张),当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack): 栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量),除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中.由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场,从这个意义上讲,我们可以把堆栈看成一个寄存,交换临时数据的内存区.
text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载,而bss段不在可执行文件中,由系统初始化.
bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小, data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。 DATA段包含经过初始化的全局变量以及它们的值。 BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含DATA和BSS段的整个区段此时通常称为数据区。
ARM map(Program size)的更多相关文章
- Keil中 Program Size: Code RO-data RW-data ZI-data
一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘. 现在我们就一个STM32的工程为例子 linking... Program Size: ...
- Program Size
在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320 RO-data=4864 RW-data=44 ZI-d ...
- Keil 中 Program Size: Code RO-data RW-data ZI-data 所代表的意思
在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320 RO-data=4864 RW-data=44 ZI-data ...
- keil编译后Program Size: Code=46284 RO-data=988 RW-data=580 ZI-data=1094588
Program Size: Code=46284 RO-data=988 RW-data=580 ZI-data=1094588 Code : 程序中代码所占字节大小 RO-data : ...
- 关于Program Size
Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 Code是代码占用的空间,RO-data是 Read Only 只读常 ...
- keil Bulid Ouput窗口中PROGRAM SIZE项的具体含义
在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320 RO-data=4864 RW-data=44 ZI ...
- 转载:cnn学习之卷积或者池化后输出的map的size计算
相信各位在学习cnn的时候,常常对于卷积或者池化后所得map的的大小具体是多少,不知道怎么算.尤其涉及到边界的时候. 首先需要了解对于一个输入的input_height*input_widtht的 ...
- EFM32 ARM+ KEIl program
1Hardware connection When using the EFM32 starter kit to make a JLINK burn, you must connect the con ...
- Program Size: data=9.0 xdata=0 code=47
data=47.0 编译器编译后,程序总共需要占用47字节的片内RAM空间.注意这个大小仅仅是累加而已,并未考虑各个块之间的空隙,也就是说实际占用的RAM空间可能多于此数值.xdata=0 程序未使用 ...
随机推荐
- phpcms栏目调用
{loop subcat(0,0,0,$siteid) $r} {php $num++} <h3><a href="{$r[url]}">{$r[catna ...
- 我学C的那些年[ch01]:浅淡C语言的编译过程
前几天大致学习了C语言的编译过程,那么今天就和大家分享一下 首先,编译C语言,需要一个文本编辑器(windows自带的也行),和一个MinGW编译器(需要配置环境),就可以将.c文件编译成.exe文件 ...
- NSString 练习
//将“⽂文艺⻘青年”改成“213⻘青年”. NSString *str = @"文艺青年"; NSString *str1 = [str stringByRepl ...
- 转:PHP开发者应了解的24个库
原文来自于:http://blog.jobbole.com/54201/ 作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许多多有用的库分发出来,在Github上很容易发现和使用这些库.下面是 ...
- Hadoop 学习笔记 (八) hadoop2.2.0 测试环境部署 及两种启动方式
1基本流程步骤1:准备硬件(linux操作系统)步骤2:准备软件安装包,并安装基础软件(主要是JDK)步骤3:修改配置文件步骤4:分发hadoop步骤5:启动服务步骤6:验证是否启动成功!2硬件配置要 ...
- js 返回前一页并刷新页面方法
[导读] 要返回上一页再刷新页面我们用到最多的是在像php,asp,jsp,asp.net中,下面我来给大家先介绍js 返回前一页并刷新页面,然后再把这些代码放在php中实现删除后返回当前页面并刷新页 ...
- Unity3d ngui基础教程
Unity3d ngui基础教程 NGUI教程:步骤1-Scene 1.创建一个新的场景(New Scene).2.选择并删除场景里的MainCamera.3.在NGUI菜单下选择Create a N ...
- SQL Server 全文搜索 配置、查询初体验
原文:SQL Server 全文搜索 配置.查询初体验 一.使用SQL Server全文搜索配置 要使用SQL Server的全文搜索服务,需要进行如下配置. 1.开启全文搜索服务: 2.开启数据库的 ...
- 14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读意味着 InnoDB 使用多版本来实现一个查询数据库的快照在某个时间点. 查看看到的事务做出的改变被提 ...
- C参数计算
C‘计算参数时,从右向左压栈的 int a[]={1,3,4}; int * ptr=a; pirntf("%d,%d\n",*ptr,*(++ptr)); 输出都是3: