微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 引用 ADS1.2下ARM映像文件

引用 ADS1.2下ARM映像文件

时间:11-10 来源:互联网 点击:

and execution aof the region containing the RO

section. If you do not enter a value, the value defaults to 0x8000.

意思是,这个文本框设置加载时地址和运行时地址。如果没有设置值,默认时0x8000。这个值将会对应ADS的预定义变量Image$$RO$$Base,指定了RO的base。这个变量可以被初始化程序IMPORT进去。这个参数有两个意思:1,如果生成可执行bin文件烧写到flash中去,那么这个地址就是要烧到flash中的地址(一般是0x0)。这里又出现一个问题,如果使用的ARM芯片是支持memory remap的(如三星的4510芯片),那么可以在bootloader程序中将RO段搬运到RAM中,再把RAM remap 到0x0,这样系统读取RO段的时候就可以在RAM中读了。如果ARM芯片不支持remap(如三星的44b0x),那么RO段不能搬运到RAM中,而在FLASH中读取。2,如果生成afx调试文件,那么这个地址是调试时加载到RAM中的地址。

根据上面的1,2可知,如果要烧写FLASH 那么RO Base 应该设置成ARM片选的FLASH 的首地址;如果要调试那么RO Base要设置成RAM地址。

RW Base 这个文本框设定包含RW和ZI输出段的运行时域地址。如果你在这里输入一个值,连接器创建一个包含两个运行时域的映象,这两个域是:

包含RO输出段的运行时域

包含RW和ZI输出段的运行时域

如果你输入了RW Base值并且选择了Split image选项,连接器创建的映象文件分别包含RW输出段和ZI输出段的装载时地址和运行时地址,并都由你输入的RW Base值指定。

对于简单连接方式,当没有输入RW Base值时,映象文件包含一个加载时域和一个运行时域。这时,RO输出段、RW输出段、ZI输出段都包含在一个域中。当输入RW Base值时,映象文件包含两个运行时域,一个包含RO输出段,一个包含RW输出段和ZI输出段。当指定了-split选项时,映象文件又多包含两个加载时域,一个包含RO输出段,一个包含RW输出段和ZI输出段。

简单的初始化用户程序的执行环境

ARM映像文件一开始总是存储在ROM/Flash里面的,其RO部分既可以在ROM/Flash里面执行,也可以转移到速度更快的RAM中执行;而RW和ZI这两部分是必须转移到可写的RAM里去,其实RW包括ZI区域,ZI区域放的是未赋值的全局变量,RW 区域放的是已赋值(赋0除外)的全局变量。所谓应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。

先介绍几个必要的符号,编译器使用下列符号来记录各段的起始和结束地址:
|Image$$RO$$Base| :RO段起始地址
|Image$$RO$$Limit| :RO段结束地址加1 (在加载域中,是RW的起始地址)
|Image$$RW$$Base| :RW段起始地址 (在运行域中即运行的时候,是RW的起始地址)
|Image$$RW$$Limit| :ZI段结束地址加1
|Image$$ZI$$Base| :ZI段起始地址
|Image$$ZI$$Limit| :ZI段结束地址加1
这些符号的值是根据链接器中设置的中ro-base和rw-base的设置来计算的。 由于rw和zi相连,|Image$$ZI$$Base|就等于|Image$$RW$$Limit| .其它的值都是编译器自动计算出来的。我们还可以通过scatter文件更详细得指定各个输出段的工作地址。
初始化用户执行环境主要是把ro、rw、zi三段拷贝到指定的位置。

下面的程序是rw、zi段在运行域中的搬运过程:

;Copy and paste RW data/zero initialized data
ldr r0, =|Image$$RO$$Limit| /*取RO区末地址后面的地址,即RW数据源的起始地址*/
ldr r1, =|Image$$RW$$Base|/*取RW区在RAM里的执行区起始地址,即编译器选项RW_Base指定的地址*/
ldr r3, =|Image$$ZI$$Base|/*取ZI区在RAM里面的起始地址*/

;Zero init base => top of initialised data
cmp r0, r1 /* 比较ROM区中数据段首地址和RAM区中RW段目标首地址*/
beq %F2 /*相等代表当前已经是在RAM中运行*/(F表示after,B表示before,r0与r1相等则转跳)
/*B %F2表向前跳到标号为2的Lable处*/
1
cmp r1, r3 /*不相等则和RAM区中ZI段的目标地址比较*/
ldrcc r2, [r0], #4/*如果r1strcc r2, [r1], #4/*如果r1bcc %B1 /*如果r12
ldr r1, =|Image$$ZI$$Limit| /* 取ZI段的结束地址 */
mov r2, #0 /*将r2赋值为0*/
3
cmp r3, r1 ; Zero init
strcc r2, [r3], #4 /*如果r3bcc %B3 /*如果r3

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top