您的位置 首页 方案

ARM映像文件 he 编译器主动生成的发动函数

什么是arm的映像文件arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。在axd调试过程中,我们调试的是ax

什么是arm的映像文件

arm映像文件其实便是可履行文件,包括bin或hex两种格局,能够直接烧到rom里履行。在axd调试进程中,咱们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。
能够参阅下面的pdf:ARM映像文件及履行机理
part1 part3
映像文件的组成
ARM映像文件是一个层次性结构的文件,包括了域(region),输出段(output section)和输入段(input section)。
所谓域,指的便是整个bin映像文件地点在的区域,它又分为加载域和运转域。
加载域便是映像文件被静态寄存的作业区域,一般来说flash里的 整个bin文件地点的地址空间便是加载域,当然在程序一般都不会放在 flash里履行,一般都会搬到sdram里运转作业,它们在被搬到sdram里作业地点的地址空间便是运转域。
ARM映像文件一开始总是存储在ROM/Flash里边的,其RO部分既能够在ROM/Flash里边履行,也能够转移到速度更快的RAM中履行;而RW和ZI这两部分是有必要转移到可写的RAM里去,其实RW包括ZI区域。
什么是RO段、RW段和ZI段
一个ARM程序包括3部分:RO,RW和ZI
RO便是ReadOnly,程序中的指令和常量
RW便是Read/Write,程序中的已初始化变量
ZI便是Zero Init,程序中的未初始化的变量
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在C中的意思,请看下面比如:
1)RO
看下面两段程序,他们之间差了一条句子,这条句子便是声明一个字符常量。因而依照咱们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节)。
Prog1:
#include
void main(void)
{
;
}
Prog2:
#include
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
void main(void)
{
;
}
Prog4:
#include
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巨细有不同。
Prog5:
#include
void main(void)
{
;
}
Prog6:
#include
char a;
void main(void)
{
;
}
Prog5编译出来后的信息如下:
===========================================================
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)
===========================================================
Prog6编译出来后的信息如下:
===========================================================
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区域。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/255980.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部