新聞中心

ARM分散加載文件

作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
(一)原理

ARM的連接器提供了一種分散加載機(jī)制,在連接時(shí)可以根據(jù)分散加載文件(.scf文件)中指定的存儲器分配方案,將可執(zhí)行鏡像文件分成指定的分區(qū)并定位于指定的存儲器物理地址。這樣,當(dāng)嵌入式系統(tǒng)在復(fù)位或重新上電時(shí),在對CPU相應(yīng)寄存器進(jìn)行初始化后,首先執(zhí)行ROM存儲器的Bootloader代碼,根據(jù)連接時(shí)的存儲器分配方案,將相應(yīng)代碼和數(shù)據(jù)由加載地址拷貝到運(yùn)行地址,這樣,定位在RAM存儲器的代碼和數(shù)據(jù)就在RAM存儲器中運(yùn)行,而不再從ROM存儲器中取數(shù)據(jù)或取指令,從而大大提高了CPU的運(yùn)行速率和效率。

本文引用地址:http://butianyuan.cn/article/201611/317889.htm

(二)結(jié)構(gòu)

Scatlertoading的存儲區(qū)塊可以分成二種類型:

裝載區(qū):當(dāng)系統(tǒng)啟動(dòng)或加載時(shí)應(yīng)用程序的存放區(qū)。
執(zhí)行區(qū):系統(tǒng)啟動(dòng)后,應(yīng)用程序進(jìn)行執(zhí)行和數(shù)據(jù)訪問的存儲器區(qū)域,系統(tǒng)在實(shí)時(shí)運(yùn)行時(shí)可以有一個(gè)或多個(gè)執(zhí)行塊。

(三)分散加載時(shí)連接器生成的預(yù)定義符號

在編譯連接時(shí)如果指定了分散加載文件(.scf文件),在連接后會(huì)自動(dòng)生成如下變量:


(四)具體例子說明

;ROM_LOAD為加載區(qū)的名稱,其后面的0x00000000表示加載區(qū)的起始地址(存放程序代碼的起始地址)
ROM_LOAD 0x0
{
;ROM_EXEC描述了執(zhí)行區(qū)的地址,放在第一塊位置定義
ROM_EXEC 0x00000000
{
;從起始地址開始放置向量表(即Startup.o(vectors, +First),其中Startup.o為Startup.s的目標(biāo)文件)

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

;AREAvectors, CODE, READONLY
Startup.o (vectors, +First)
;接著放置其它代碼(即* (+RO)),* 是通配符,類似WINDOW下搜索用的通配符
* (+RO)
}
;變量區(qū)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開始為變量區(qū)

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

;這個(gè)地址是片外RAM 的結(jié)束地址,根據(jù)實(shí)際情況修改
HEAP_BOTTOM 0x80080000 UNINIT
{
Startup.o (HeapTop)
}
}

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

|Image$$ROM_LOAD $$Limit|

|Image$$ROM_EXEC $$Limit|

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

;重定向__user_initial_stackheap 函數(shù)

;分配新的bottom_of_heap地址等,R0-R3是函數(shù)必須的返回值,返回bottom_of_heap的值

;通過分散加載描述文件,重定向其位置,bottom_of_heap等已經(jīng)在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



關(guān)鍵詞: ARM分散加載文

評論


技術(shù)專區(qū)

關(guān)閉