您的位置 首页 新品

ARM映像文件及其地址映射

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

1、什么是arm映像文件

arm映像文件其实便是可履行文件,包含bin或hex两种格局,能够直接烧到ROM里履行。在axd调试过程中,咱们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。

映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI),输出段又由输入段组成。所谓域,指的便是整个bin映像文件所在在的区域,它又分为加载域和运转域。关于嵌入式体系而言,程序映象都是存储在Flash存储器等一些非易失性器材中的,而在运转时,程序中的RW段有必要从头装载到可读写的RAM中。简略来说,程序的加载时域便是指程序烧入Flash中的状况,运转时域是指程序履行时的状况。一般来说flash里的整个bin文件地点的地址空间便是加载域,当然在程序一般都不会放在flash里履行,一般都会搬到sdram里运转作业,它们在被搬到sdram里作业所在的地址空间便是运转域。咱们输入的代码,一般有代码部分和数据部分,这便是所谓的输入段,通过编译后就变成了bin文件中ro段和rw段,还有所谓的zi段,这便是输出段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。关于加载域中的输出段,一般来说RO段后边紧跟着RW段,RW段后边紧跟着ZI段。在运转域中这些输出段并不接连,但RW和ZI一定是连着的。ZI段和RW段中的数据其实能够是RW特点。

2、简略地址映射

关于比较简略的状况,能够在ADS集成开发环境的ARM LINKER选项output中指定RO Base和RW Base,即在simple形式下,奉告衔接器RO和RW的衔接基地址。

这种形式下,ARM Linker会输出以下符号,它们指示了在运转域中各个输出段所在的地址空间,在运用的时分能够用IMPORT引进:

| Image$$RO$$Base|:表明RO段在运转域中的开端地址
|Image$$RO$$Limit|:表明RO区末地址后边的地址,即RW数据源的开端地址
|Image$$RW$$Base|:RW区在RAM里的履行区开端地址,也便是编译器选项RW_Base指定的地址
|Image$$ZI$$Base|:ZI区在RAM里边的开端地址
|Image$$ZI$$Limit|:ZI区在RAM里边的完毕地址后边的一个地址
RO Base对应的便是| Image$$RO$$Base|,RW Base对应的是|Image$$RW$$Base|,因为ZI段是包含在RW段里的,所以|Image$$RW$$Limit|就等于|Image$$ZI$$limit|。

下面给出一个比如,假定RO Base设为0x00000000,后边的RWBase地址是0x30000000,然后在Options选项中有Image entry point,是一个初始程序的进口地址,设为0x00000000,。现在要做的便是将RW section移到以0x30000000开端的当地,而且发明一个ZI section。
首要比较Image$$RO$$Limit和Image$$RW$$Base,假如持平,阐明execution view下RW section的地址和load view下RW section的地址相同,这样,不需求移动RW section;假如不等,阐明需求移动RW section到它在execution view中的当地,把ROM里|Image$$RO$$Limt|开端的RW初始数据拷贝到RAM里边|Image$$RW$$Base|开端的地址,当RAM这边的方针地址抵达|Image$$ZI$$Base|后就表明RW区的完毕和ZI区的开端,接下去就对这片ZI区进行清零操作,直到遇到完毕地址|Image$$ZI$$Limit|

示例代码如下:

IMPORT|Image$$RO$$Limit|

IMPORT|Image$$RW$$Base|

IMPORT|Image$$ZI$$Base|

IMPORT|Image$$ZI$$Limit|

IMPORTmain;声明C程序中的Main()函数

AREAStart,CODE,READONLY;声明代码段Start

ENTRY;标识程序进口

CODE32;声明32位ARM指令

ResetLDRSP,=0x40003F00

;初始化C程序的运转环境

LDRR0,=|Image$$RO$$Limit|;得到RW数据源的开端地址

LDRR1,=|Image$$RW$$Base|;RW区在RAM里的履行区开端地址

LDRR3,=|Image$$ZI$$Base|;ZI区在RAM里边的开端地址

CMPR0,R1;查看RW section的地址在load view和execution view下是否持平

BEQLOOP1;假如持平就不移动RW section,直接树立ZI scetion

LOOP0;不然就copy RW section到execution view下指定的地址

CMPR1,R3

LDRCCR2,[R0],#4;它把从R0中的地址开端的section copy到R1中的地址开端的section

STRCCR2,[R1],#4

BCCLOOP0

LOOP1

LDRR1,=|Image$$ZI$$Limit|;ZI section末地址

MOVR2,#0;将ZI section需求的初始化量装入R2

LOOP2

CMPR3,R1;树立并初始化ZI section

STRCCR2,[R3],#4

BCCLOOP2

Bmain;跳转到C程序代码Main()函数

END

注:LDRCCR2,[R0],#4;将地址为R0的内存单元数据读取到R2中,然后R0=R0+4

CC(小于)为条件码。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部