在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)
iram 0x40000000(5)
stacks_bottom +0 uninit(7)
stacks 0x40004000 uninit(9)
eram 0x80040000(11)
heap +0 uninit(13)
heap_bottom 0x80080000 uninit(15)
}flash_load 0x81000000 0x1000(17)
}(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可以儲存程式...