關於LPC2200啟動程式分散載入描述檔案的敘述

2021-05-28 17:32:37 字數 3466 閱讀 1629

在ads lpc2200的啟動模板中有乙個scf資料夾,其中有mem_a.scf、mem_b.scf、mem_c.scf這3個檔案,這3個檔案是ads的分散載入機制,其目的是將**段和資料段分別定位到制定位址上。可以在arm linker中選擇載入路徑。 

分散裝在技術概述:

分散裝在技術可以把使用者的應用程式分割成多個ro(唯讀)執行域和rw(可讀寫)執行域(關於域的概念大家可以在網上查查),並且給它們制定不同的位址。乙個嵌入式系統中,flash、16位ram、32位ram都可以存在於系統中,所以,將不同功能的**定位在特定的位置會大大地提高系統的執行效率。下面是最為常用的2種情況:

一、32位的ram執行速度很快,因此就把中斷服務程式作為乙個單獨的執行域,放在32位的ram,使它的響應時間達到最快。

二、程式在ram中執行,其效率要遠遠高於在rom中執行,所以將啟動**(boot loader)以外的所有**都複製在ram中執行,可以提高執行效率。

分散裝在技術主要完成了2個基本的功能:

如何分散。就是如何將輸入段組成輸出段和域。

如何裝載。就是確定裝載域和滅個執行域在儲存空間裡的位址是多少。

域可以分為裝載域和執行域

裝載域描述執行前輸出段和域在rom/ram裡的分布狀態,執行域描述了執行時輸出段和域在rom/ram裡的分布狀態。大多數情況下,映像檔案哎執行前把它裝載到rom裡,而當執行時,域裡的有些輸出段(比如rw型別的輸出段)必須複製到ram裡,程式才能正常執行,所以,在裝載和執行時,rw類的輸出段處在不同的位置(位址空間)。

scatterfile分散載入檔案:

在scatterfile中可以為每乙個**或資料區在裝載和執行時指定不同的儲存區域位址,scatlertoading的儲存區塊可以分成二種型別:

裝載區:當系統啟動或載入時應用程式的存放區。

執行區:系統啟動後,應用程式進行執行和資料訪問的儲存器區域,系統在實時執行時可以有乙個或多個執行塊。

映像中所有的**和資料都有乙個裝載位址和執行位址(二者可能相同也可能不同,視具體情況而定)。

scatter檔案語法

scatter檔案是乙個簡單的文字檔案,包含一些簡單的語法。

my region 0x0000 0x1000

標題 每個塊由乙個頭標題開始定義,頭中至少包含塊的名字和起始位址,如(0x0000),另外還有最大長度等其他一些屬性選項(注:這些屬性是可選的,如0x1000)。

內容 塊定義的內容包括在緊接的一對花括號內,依賴於具體的系統情況。

乙個載入塊必須至少含有乙個執行塊;實踐中通常有多個執行塊。

乙個執行塊必須至少含有乙個**或資料段;這些通常來自原始檔或庫函式等的目標檔案;萬用字元號*可以匹配指定屬性項中所有沒有在檔案中定義的餘下部分。

有以下幾種屬性:

ro:唯讀的**段和常量

rw:可以讀寫的全域性變數和靜態變數

zi:rw段中要被初始化為零的變數。

scatterfile中的定義要按照系統衝定向後的儲存器分布情況進行,在引導程式完成初始化任務後,應該把主程式轉移到ram中執行以加快系統的執行速度。

lpc2200分散載入檔案分析:

rom_load 0x80000000                             (1)

rom_exec 0x80000000                         (2)

startup.o (vectors, +first)             (3)

* (+ro)                                 (4)

iram 0x40000000                             (5)

startup.o (mystacks)                    (6)

stacks_bottom +0 uninit                     (7)

startup.o (stackbottom)                 (8)

stacks 0x40004000 uninit                    (9)

startup.o (stacks)                      (10)

eram 0x80040000                             (11)

* (+rw,+zi)                             (12)

heap +0 uninit                              (13)

startup.o (heap)                        (14)

heap_bottom 0x80080000 uninit               (15)

startup.o (heaptop)                     (16)

flash_load 0x81000000 0x1000                    (17)

flash_exec 0x81000000                        (18)

main.o (+ro)                              (19)

(1)載入時域描述,名稱位rom_loda 它的位址為0x80000000;0x80000000為lpc片外ram位址,即將以下的載入的段和域都在ram中。

(2)第乙個執行時域描述。rom_exec描述了執行區的位址,放在第一塊定義,其起始位址、空間大小域載入區起始位址、空間大小要一樣。

(2)-(4)從起始位址開始放置向量表。startup.o是startup.s的目標檔案。vectors為中斷向量表。模組startup位於該載入域的開頭(+first),vectors作為入口點,包含全部的ro**。arm在晶元復位之後,系統進入管理模式、arm狀態,pc(r15)暫存器的值為0x00000000,所以必須保證使用者的向量表**定位在0x00000000處,或者對映到0x00000000處(例如向量表**在0x80000000處,通過儲存器對映,訪問0x0000000就是訪問0x80000000)。

(5)-(6)第二執行時域描述。將mystacks堆疊段裝載到片內靜態ram中。

(7)-(8)將棧底放入堆疊的後面(+0)不進行初始化(uninit), 棧底為startup中的stackbottom。

(9)-(10) 將棧放入位址為0x40004000 並且不進行初始化(uninit)。

(11)-(12將所有的rw和zi段放入外部儲存器中以0x80040000為開頭的位址中。並且全部清零(+zi)外部ram中指定的區域。

(13)-(14)在rw zi段後放入堆底(startup.o(heap))並且不進行初始化。

(15)-(16)將堆定放入外部ram中(0x80080000)。

(17)-(19)自己新增的載入**,把main.c的目標檔案載入到片外flash中並且占用了0x1000的大小。

關於LPC2200啟動程式分散載入描述檔案的敘述

在ads lpc2200的啟動模板中有乙個scf資料夾,其中有mem a.scf mem b.scf mem c.scf這3個檔案,這3個檔案是ads的分散載入機制,其目的是將 段和資料段分別定位到制定位址上。可以在arm linker中選擇載入路徑。分散裝在技術概述 分散裝在技術可以把使用者的應用...

linux關於後台啟動程式

正經學徒,佛系記錄,不搞事情 最終語句 nohup test.sh 1 dev null 2 1 解釋 建立test.sh測試指令碼 vi test.sh 內容 bin bash while true do echo 不停的執行 sleep 5 done 設定檔案許可權可執行 結果是內容直接輸出在控...

關於NAND NOR啟動程式的具體走向

看完 tq2440學習之硬體篇 相信大家應該清楚nand flash和nor flash還有sdram的位址空間分配了吧。這裡我還是貼上,方便後面對啟動過程進行分析 tq2440中記憶體分配及各儲存器特性 nor flash 0x0000 0000 開始的 2mb空間,nor flash可以儲存程式...