×
嵌入式 > 嵌入式开发 > 详情

ARM分散加载文件

发布时间:2020-08-18 发布时间:
|
(一)原理

ARM的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件(.scf文件)中指定的存储器分配方案,将可执行镜像文件分成指定的分区并定位于指定的存储器物理地址。这样,当嵌入式系统在复位或重新上电时,在对CPU相应寄存器进行初始化后,首先执行ROM存储器的Bootloader代码,根据连接时的存储器分配方案,将相应代码和数据由加载地址拷贝到运行地址,这样,定位在RAM存储器的代码和数据就在RAM存储器中运行,而不再从ROM存储器中取数据或取指令,从而大大提高了CPU的运行速率和效率。

(二)结构

Scatlertoading的存储区块可以分成二种类型:

装载区:当系统启动或加载时应用程序的存放区。
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。

(三)分散加载时连接器生成的预定义符号

在编译连接时如果指定了分散加载文件(.scf文件),在连接后会自动生成如下变量:


(四)具体例子说明

;ROM_LOAD为加载区的名称,其后面的0x00000000表示加载区的起始地址(存放程序代码的起始地址)
ROM_LOAD 0x0
{
;ROM_EXEC描述了执行区的地址,放在第一块位置定义
ROM_EXEC 0x00000000
{
;从起始地址开始放置向量表(即Startup.o(vectors, +First),其中Startup.o为Startup.s的目标文件)

;+First表示Vector段放在最前面

;AREAvectors, CODE, READONLY
Startup.o (vectors, +First)
;接着放置其它代码(即* (+RO)),* 是通配符,类似WINDOW下搜索用的通配符
* (+RO)
}
;变量区IRAM的起始地址为0x40000000
IRAM 0x40000000
{
;放置Startup.o (MyStacks)
Startup.o (MyStacks)
}
;+0表示接着上一段,UNINIT表示不初始化
STACKS_BOTTOM +0 UNINIT
{
;放置AREA StackBottom, DATA, NOINIT
Startup.o (StackBottom)
}
;接着从0x40004000开始,放置AREAStacks, DATA, NOINIT,UNINIT表示不初始化
STACKS 0x40004000 UNINIT
{
Startup.o (Stacks)
}
;外部RAM从0x80000000开始为变量区

;如果片外RAM起始地址不为0x8000 0000,则需要修改mem_.scf文件
ERAM 0x80000000
{
* (+RW,+ZI)
}
;+0表示接着上一段,UNINIT表示不初始化
HEAP +0 UNINIT
{
;放置堆底,AREA Heap, DATA, NOINIT
Startup.o (Heap)
}
;接着在外部0x80080000放置堆顶

;这个地址是片外RAM 的结束地址,根据实际情况修改
HEAP_BOTTOM 0x80080000 UNINIT
{
Startup.o (HeapTop)
}
}

以上分散文件的可引用的段名

|Image$$ROM_LOAD $$Limit|

|Image$$ROM_EXEC $$Limit|

。。。。。。。。。。。。。。。。

;重定向__user_initial_stackheap 函数

;分配新的bottom_of_heap地址等,R0-R3是函数必须的返回值,返回bottom_of_heap的值

;通过分散加载描述文件,重定向其位置,bottom_of_heap等已经在Startup.s中定义为DATA类型

__user_initial_stackheap
LDR r0,=bottom_of_heap
; LDR r1,=StackUsr
LDR r2,=top_of_heap
LDR r3,=bottom_of_Stacks
MOV pc,lr



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
瑞萨I3C总线扩展和SPD集线器产品通过基板管理控制器认证