打印
[应用相关]

SMT32:ARM编译中的RO、RW和ZI DATA区段

[复制链接]
1629|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
拿起书本|  楼主 | 2014-11-12 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成
    一个ARM程序包含3部分:RO段,RW段和ZI段
    RO是程序中的指令和常量
    RW是程序中的已初始化变量
    ZI是程序中的未初始化的变量
    由以上3点说明可以理解为:
    RO就是readonly,
    RW就是read/write,
    ZI就是zero
二、ARM映像文件的组成
    所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。


三、
Q:为什么Image中必须包含RO和RW?
A:因为RO中的指令和常量以及RW中初始化过的变量是不能像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程序才能正常访问变量。否则只能运行不含变量的代码。
    说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。
1; RO
    看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。因此按照我们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节)。
Prog1:
#include <stdio.h>
void main(void)
{
;
}
Prog2:
#include <stdio.h>
const char a = 5;
void main(void)
{
;
}
Prog1编译出来后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog2编译出来后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 61 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1009 ( 0.99kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
================================================================================
以上两个程序编译出来后的信息可以看出:
Prog1和Prog2的RO包含了Code和RO Data两类数据。他们的唯一区别就是Prog2的RO Data比Prog1多了1个字节。
这正和之前的推测一致。如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。
2; RW
同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,
所以两个程序之间应该是RW大小有区别。
Prog3:
#include <stdio.h>
void main(void)
{
;
}
Prog4:
#include <stdio.h>
char a = 5;
void main(void)
{
;
}
Prog3编译出来后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog4编译出来后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 1 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
================================================================================
可以看出Prog3和Prog4之间确实只有RW Data之间相差了1个字节,这个字节正是被初始化过的一个字符型变量“a”所引起的。

3; ZI
    再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,
这两个程序之间应该只有ZI大小有差别。
Prog3:
#include <stdio.h>
void main(void)
{
;
}
Prog4:
#include <stdio.h>
char a;
void main(void)
{
;
}
Prog3编译出来后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog4编译出来后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 97 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
    编译的结果完全符合推测,只有ZI数据相差了1个字节。这个字节正是未初始化的一个字符型变量“a”所引起的。
    注意:如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。
即:ARM C程序中,所有的未初始化变量都会被自动初始化为0。
总结:
1; C中的指令以及常量被编译后是RO类型数据。
2; C中的未被初始化或初始化为0的变量编译后是ZI类型数据。
3; C中的已被初始化成非0值的变量编译后市RW类型数据。
附:
程序的编译命令(假定C程序名为tst.c):
armcc -c -o tst.o tst.c
armlink -noremove -elf -nodebug -info totals -info sizes -map -list aa.map -o tst.elf tst.o
编译后的信息就在aa.map文件中。
ROM主要指:NAND Flash,Nor Flash
RAM主要指:PSRAM,SDRAM,SRAM,DDRAM

以上摘自(原文不知何处):
http://hi.baidu.com/smallwormsea ... 22520a4a90a7a1.html

沙发
拿起书本|  楼主 | 2014-11-12 15:58 | 只看该作者
另外,
1、你会发现:ROM Size不等于RO和RW的总和,原因是这里使用了RW数据压缩,LInker默认把下载到ROM的重复的RW数据压缩。如下表,可见,原本的316B的RW被压缩为108B,也正如上文开头说的那样,Image文件(下载到ROM的文件)是没有包括ZI的,所以这里由2692B变成实际下载到ROM的0B。

2、其中inc.data为内联数据(inline data),是包含在code里面的,如文字池、短字符串,这个与RO data很相似的,但是和RO Data有什么区别呢?(现在可以确定的是const数据归为RO data,但明显不只有const数据,难道还有‘长字符串’??待查)
3、如上文介绍,下载到单片机上的image文件只包括RO和RW,没有包括ZI,这就是所谓的加载区(LR),但是程序运行 时候需要重新建立映像的会生产一个ZI,这个就是所谓的执行区(ER)
==============================================================================





      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   


     14014       3494       1954        316       2692     384984   Grand Totals
     14014       3494       1954        108       2692     384984   ELF Image Totals(compressed)
     14014       3494       1954        108          0          0   ROM Totals


==============================================================================


    Total RO  Size (Code + RO Data)                15968 (  15.59kB)
    Total RW  Size (RW Data + ZI Data)              3008 (   2.94kB)
    Total ROM Size (Code + RO Data + RW Data)      16076 (  15.70kB)


==============================================================================




使用特权

评论回复
板凳
mmuuss586| | 2014-11-12 17:41 | 只看该作者

支持楼主分享;

使用特权

评论回复
地板
bobde163| | 2014-11-12 23:11 | 只看该作者
好**,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4195

帖子

31

粉丝