您的位置 首页 传感器

ARM涣散加载文件

(一)原理ARM的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件(.scf文件)中指定的存储器分配方案,将可执行镜像文件分成指…

(一)原理

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

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部