(一)原理
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