摘要 從arm elf目標檔案主要構成出發,詳細介紹了分散載入的基本原理、分散載入檔案的語法、分散載入時聯結器生成的預定義符號及要重新實現的函式等;以定位目標外設和定義超大型結構體陣列兩項應用案例加以說明,並給出完整的工程例項和bootloader**。這些都已經在實際工程中多次應用和驗證,是筆者實際工程的萃取。
引言在當今的嵌入式系統設計中,arm處理器以**便宜、功耗低、整合度高、外設資源豐富和易於使用的特點而得到廣泛的應用;在速度和效能方面已達到或超過了部分pc104嵌入式計算機的效能,而成本卻比相應的pc104計算機低很多,廣泛應用於手機、gps接收機、地圖導航、路由器、乙太網交換機及其他民用和工業電子裝置。
在乙個採用arm處理器的實時嵌入式系統中,目標硬體常常由flash、sram、sdram和nvram(非易失性ram)等儲存器組成,並定位於不同的實體地址範圍,那麼,怎樣通過軟體更好地訪問和利用這些不同的儲存器並讓系統高效地執行?分散載入(scatter loading)就提供了這樣一種機制。它可以將記憶體變數定位於不同的實體地址上的儲存器或埠,通過訪問記憶體變數即可達到訪問外部儲存器或外設的目的;同時通過分撒載入,讓大多數程式**在高速的內部ram中執行,從而使得系統的實時性大大增強。
1.arm elf目標檔案的主要構成
arm elf(executable and linking format)目標檔案主要由.text段、.data段、.bss段構成,其他段如.debug段、.comment段等與本文關係部大,不作介紹。
.text 段由可執行**組成,段型別為code,屬性為ro;
.data 段由已初始化資料組成,段型別為data, 屬性為ro;
.bss 段由未初始化資料組成,段型別為zero, 屬性為rw,在應用個程式啟動時對該段的資料初始化為零。如果在分散載入檔案中指定了uninit屬性,則在應用程式啟動時不初始化該段。
2. 分散載入的基本原理
假設乙個採用arm處理器的實時嵌入式系統目標硬體的儲存器由rom儲存器和ram儲存器組成。當乙個嵌入式在**環境下除錯完畢,需要離線執行的時候,就需要將源程式編譯連線成可執行目標**並燒寫到rom儲存器中。由於rom儲存器訪問資料的速率比ram儲存器慢,因此,讓程式在rom儲存器中執行。cpu每次取指令和取資料操作都要訪問rom儲存器,這樣需要在cpu的匯流排週期中插入等待週期,通過降低匯流排的速率來滿足訪問慢速的rom儲存器,這樣識別會降低cpu的執行速率和效率,因此,分散載入就顯得非常重要。
arm的聯結器提供了一種分散載入機制,在連線時可以根據分散載入檔案(.scf檔案)中指定的儲存器分配方案,將可執行映象檔案分成指定的分割槽並定位於指定的儲存器實體地址。這樣,當嵌入式系統在復位或重新上電時,在對cpu相應暫存器進行初始化後,首先執行rom儲存器的bootloader**,根據連線時的儲存器分配方案,將相應**和資料由載入位址拷貝到執行位址,這樣,定位在ram儲存器的**和資料就在ram儲存器中執行,而不再從rom儲存器中取資料或取指令,從而大大提高了cpu的執行速率和效率。
(二)結構
scatlertoading的儲存區塊可以分成二種型別:
裝載區:當系統啟動或載入時應用程式的存放區。
執行區:系統啟動後,應用程式進行執行和資料訪問的儲存器區域,系統在實時執行時可以有乙個或多個執行塊。
(三)分散載入時聯結器生成的預定義符號
在編譯連線時如果指定了分散載入檔案(.scf檔案),在連線後會自動生成如下變數:
(四)具體例子說明 ;
rom_load
為載入區的名稱,其後面的
0x00000000
表示載入區的起始位址(存放程式**的起始位址)
rom_load 0x0
;變數區
iram
的起始位址為
0x40000000
iram 0x40000000;+0
表示接著上一段,
uninit 表示不初始化
stacks_bottom +0 uninit
;接著從
0x40004000
開始,放置
area stacks, data, noinit
,uninit
表示不初始化
stacks 0x40004000 uninit
;外部ram
從0x80000000
開始為變數區
;如果片外ram起始位址不為0x8000 0000,則需要修改mem_.scf檔案
eram 0x80000000;+0
表示接著上一段,
uninit
表示不初始化
heap +0 uninit
;接著在外部
0x80080000
放置堆頂
;這個位址是片外ram 的結束位址,根據實際情況修改
heap_bottom 0x80080000 uninit}
以上分散檔案的可引用的段名
|image
romloadromload
limit|
|image
romexecromexec
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
ARM分散載入檔案
一 原理 arm的聯結器提供了一種分散載入機制,在連線時可以根據分散載入檔案 scf檔案 中指定的儲存器分配方案,將可執行映象檔案分成指定的分割槽並定位於指定的儲存器實體地址。這樣,當嵌入式系統在復位或重新上電時,在對cpu相應暫存器進行初始化後,首先執行rom儲存器的bootloader 根據連線...
ARM分散載入檔案
可以將 放入不同的儲存空間。了解分散載入檔案之前,首先需要了解code ro data rw data zi data。define num 0x2000 ro data char const flage 5 ro data char str str rw data char a zi data 下...
關於分散載入檔案
分散載入 scatlerloading 即工程裡的.scf檔案。在scatterfile中可以為每乙個 或資料區在裝載和執行時指定不同的儲存區域位址,scatlertoading的儲存區塊可以分成二種型別 裝載區 當系統啟動或載入時應用程式的存放區。執行區 系統啟動後,應用程式進行執行和資料訪問的儲...