日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ARMLink scatter file(1)

系統(tǒng) 2233 0

概述

Scatter file ( 分散加載描述文件 ) 用于 armlink 的輸入?yún)?shù),他指定映像文件內(nèi)部各區(qū)域的 download 與運(yùn)行時位置。 Armlink 將會根據(jù) scatter file 生成一些區(qū)域相關(guān)的符號,他們是全局的供用戶建立運(yùn)行時環(huán)境時使用。

(注意:當(dāng)使用了 scatter file 時將不會生成以下符號:

Image$$RW$$Base,

Image$$RW$$Limit,

Image$$RO$$Base,

Image$$RO$$Limit,

Image$$ZI$$Base,

Image$$ZI$$Limit

什么時候使用 scatter file

當(dāng)然首要的條件是你在利用 ADS 進(jìn)行項(xiàng)目開發(fā),下面我們看看更具體的一些情況。

1 存在復(fù)雜的地址映射:例如代碼和數(shù)據(jù)需要分開放在在多個區(qū)域。

2 存在多種存儲器類型:例如包含 Flash,ROM,SDRAM, 快速 SRAM 。我們根據(jù)代碼與數(shù)據(jù)的特性把他們放在不同的存儲器中,比如中斷處理部分放在快速 SRAM 內(nèi)部來提高響應(yīng)速度,而把不常用到的代碼放到速度比較慢的 Flash 內(nèi)。

3 函數(shù)的地址固定定位:可以利用 Scatter file 實(shí)現(xiàn)把某個函數(shù)放在固定地址,而不管其應(yīng)用程序是否已經(jīng)改變或重新編譯。

4 利用符號確定堆與堆棧:

5 內(nèi)存映射的 IO :采用 scatter file 可以實(shí)現(xiàn)把某個數(shù)據(jù)段放在精確的地指處。

因此對于嵌入式系統(tǒng)來說 scatter file 是必不可少的,因?yàn)榍度胧较到y(tǒng)采用了 ROM , RAM ,和內(nèi)存映射的 IO

scatter file 實(shí)例

1 簡單的內(nèi)存映射

LOAD_ROM 0x0000 0x8000

{

EXEC_ROM 0x0000 0x8000

{

*(+RO)

}

RAM 0x10000 0x6000

{

*(+RW, +ZI)

}

}

LOAD_ROM( 下載區(qū)域名稱 ) 0x0000( 下載區(qū)域起始地址 ) 0x8000( 下載區(qū)域最大字節(jié)數(shù) )

{

EXEC_ROM( 第一執(zhí)行區(qū)域名稱 ) 0x0000( 第一執(zhí)行區(qū)域起始地址 ) 0x8000( 第一執(zhí)行區(qū)域最大字節(jié)數(shù) )

{

*(+RO( 代碼與只讀數(shù)據(jù) ))

}

RAM( 第二執(zhí)行區(qū)域名稱 ) 0x10000( 第二執(zhí)行區(qū)域起始地址 ) 0x6000( 第二執(zhí)行區(qū)域最大字節(jié)數(shù) )

{

*(+RW( 讀寫變量 ), +ZI( 未初始化變量 ))

}

}

2 復(fù)雜內(nèi)存映射

LOAD_ROM_1 0x0000

{

EXEC_ROM_1 0x0000

{

program1.o(+RO)

}

DRAM 0x18000 0x8000

{

program1.o (+RW, +ZI)

}

}

LOAD_ROM_2 0x4000

{

EXEC_ROM_2 0x4000

{

program2.o(+RO)

}

SRAM 0x8000 0x8000

{

program2.o (+RW, +ZI)

}

}

LOAD_ROM_1 0x0000( 下載區(qū)域一起始地址 )

{

EXEC_ROM_1 0x0000( 第一執(zhí)行區(qū)域開始地址 )

{

program1.o(+RO) (program1.o 內(nèi)的 Code RO data 放在第一執(zhí)行區(qū)域 )

}

DRAM 0x18000( 第二執(zhí)行區(qū)域開始地址 ) 0x8000( 第二執(zhí)行區(qū)域最大字節(jié)數(shù) )

{

program1.o (+RW, +ZI) (program1.o 內(nèi)的 RW data ZI data 放在第二執(zhí)行區(qū)域 )

}

}

LOAD_ROM_2 0x4000( 下載區(qū)域二起始地址 )

{

EXEC_ROM_2 0x4000

{

program2.o(+RO) (program2.o 內(nèi)的 Code RO data 放在第一執(zhí)行區(qū)域 )

}

SRAM 0x8000 0x8000

{

program2.o (+RW, +ZI) (program2.o 內(nèi)的 RW data ZI data 放在第二執(zhí)行區(qū)域 )

}

}

2.1 BNF 符號與語法

" :由引號賴標(biāo)示的符號保持其字面原意,如 A”+”B 標(biāo)示 A+B 。

A ::= B :定義 A B 。

[A] :標(biāo)示可選部分,如 A[B]C 用來標(biāo)示 ABC AC 。

A+ :用來標(biāo)示 A 可以重復(fù)任意次,如 A+ 可標(biāo)示 A,AA,AAA, …

A* :同 A+ 。

A | B :用來標(biāo)示選擇其一,不能全選。如 A|B 用來標(biāo)示 A 或者 B 。

(A B) :標(biāo)示一個整體,當(dāng)和 | 符號或復(fù)雜符號的多次重復(fù)一起使用時尤其強(qiáng)大,如( AB +(C|D) 標(biāo)示 ABC,ABD,ABABC,ABABD, …

2.2 分散加載文件各部分描述

ARMLink scatter file(1)

(2.1)

如圖 2.1 所示為一個完整的分散加載腳本描述結(jié)構(gòu)圖。下面我們對圖示中各個部分進(jìn)行講述。

2.2.1 加載區(qū)描述

每個加載區(qū)有:

名稱:供連接器確定不同下載區(qū)域

基地址:相對或絕對地址

屬性:可選

最大字節(jié)數(shù):可選

執(zhí)行區(qū)域列:確定執(zhí)行時各執(zhí)行區(qū)域的類型與位置

load_region_name (base_address | ("+" offset)) [attribute_list] [ max_size ]

"{"

execution_region_description+

"}"

load_region_name :下載區(qū)域名稱,最大有效字符數(shù) 31 。(并不像執(zhí)行區(qū)域段名用于 Load$$region_name ,而是 僅僅用于標(biāo)示下載區(qū)域)。

base_address :本區(qū)域內(nèi)部目標(biāo)被連接到的地址(按字對齊)。

+offset :相對前一個下載區(qū)域的偏移量( 4 的整數(shù)倍,如果為第一個區(qū)域)。

2.2.2 執(zhí)行區(qū) 描述

每個執(zhí)行區(qū)有:

名稱:供連接器確定不同下載區(qū)域

基地址:相對或絕對地址

屬性:確定執(zhí)行區(qū)域的屬性

最大字節(jié)數(shù):可選

輸入段:確定放在該執(zhí)行區(qū)域的模塊

exec_region_name (base_address | "+" offset) [attribute_list] [max_size]

"{"

input_section_description+

"}"

exec_region_name :執(zhí)行區(qū)域名稱,最大有效字符數(shù) 31 。

base_address :本執(zhí)行區(qū)域目標(biāo)要被聯(lián)接到的位置,按字對齊。

+offset :相對于前一個執(zhí)行區(qū)域結(jié)束地址的偏移量, 4 的整數(shù)倍;如果沒有前繼之能夠行區(qū)域(本執(zhí)行區(qū)域?yàn)樵撓螺d區(qū)域的第一個執(zhí)行區(qū)域),則該偏移量是相對于該下載區(qū)域的基址偏移量。

attribute_list PI OVERLAY , ABSOLUTE , FIXED UNINIT 。

PI: 位置獨(dú)立。

OVERLAY: 覆蓋。

ABSOLUTE: 絕對地址。

FIXED: 固定地址,下載地址與執(zhí)行地址具有該地址指示確定。

UNINIT: 未初始化數(shù)據(jù)。

RELOC :無法明確指定執(zhí)行區(qū)域具有該屬性,而只能通過繼承前一個執(zhí)行區(qū)或父區(qū)域獲得。

對于 PI OVERLAY ABSOLUTE , FIXED ,我們只能選擇一個,缺省屬性為 ABSOLUTE 。一個執(zhí)行區(qū)域要么直接繼承其前面的執(zhí)行區(qū)域的屬性或者具有屬性為 ABSOLUTE

具有 PI , OVERLAY , RELOC 屬性的執(zhí)行區(qū)域允許其地址空間重疊,對于 BSOLUTE , FIXED 屬性執(zhí)行區(qū)域地址空間重疊 Armlink 會報(bào)錯。

max_size :可選,他用于指使 Armlink 在實(shí)際分配空間大于指定值時報(bào)錯。

input_section_description :指示輸入段的內(nèi)容。

基本語法 2

2.2.3 輸入段 描述

輸入段:

ó 模塊名:目標(biāo)文件名,庫成員名,庫文件名。名稱可以使用通配符。

ó 輸入段名,或輸入段屬性 (READ-ONLY,CODE) 。

module_select_pattern

["("

("+" input_section_attr | input_section_pattern)

([","] "+" input_section_attr | "," input_section_pattern))*

")"]

2.2.3.1

module_select_pattern :選擇的模塊名稱(目標(biāo)文件,庫文件成員,庫文件),模塊名可以使用通配符( * 匹配任意多個字符,?匹配任意一個字符),名稱不區(qū)分字母大小寫,它是供選擇的樣本。

1 *libtx.a (+RO)

libtx.a threadX 庫文件。

2 tx_ill.o (INIT)

tx_ill.o threadX 中斷向量目標(biāo)文件。

2.2.3.2

input_section_attr :輸入段屬性選擇子,每個選擇子以” + ”開頭,選擇子不區(qū)分大小寫字符。

選擇子可選:

RO-CODE

RO-DATA

RO selects both RO-CODE and RO-DATA ),

RW-DATA ,

RW-CODE ,

RW selects both RW-CODE and RW-DATA ),

ZI

ENTRY that is a section containing an ENTRY point )。

以下同義詞可以選擇:

CODE (for RO-CODE) ,

CONST( for RO-DATA) ,

TEXT (for RO)

DATA (for RW) ,

BSS (for ZI)

還有兩個偽屬性: FIRST , LAST 。如果各段的先后順序比較重要時,可以使用 FIRST LAST 標(biāo)示一個執(zhí)行區(qū)域的第一個和最后一個段。

1 os_main_init.o (INIT ,+FIRST)

FIRST 表示放于本執(zhí)行區(qū)域的開始處。

2 *libtx.a (+RO)

RO 表示 *libtx.a 的只讀部分。

2.2.3.3

input_section_pattern :輸入段名。

1 os_main_init.o (INIT ,+FIRST)

INIT os_main_init.o 的一個段。

2 os_stackheap.o (heap)

heap os_stackheap.o 的一個段。

3 os_stackheap.o (stack)

stack os_stackheap.o 的一個段。

提高篇

3.1 scatter file 中指定膠合段

膠合段用于實(shí)現(xiàn) ARM 代碼到 Thumb 代碼的切換或者實(shí)現(xiàn)代碼的長轉(zhuǎn)移。使用 scatter file 可以指定怎樣放置膠合輸入段。通常,在 scatter file 中一個執(zhí)行區(qū)域可以擁有膠合段選擇 *(Venner$$Code) 。

Armlink 把膠合輸入段放到擁有段選擇符 *(Veneer$$Code) 的執(zhí)行區(qū)域中,這樣做是安全的。

可能由于地址范圍問題或者受執(zhí)行區(qū)域大小限制無法完成把膠合段分配個某個執(zhí)行區(qū)域。如果當(dāng)發(fā)生膠合段無法加到指定區(qū)域時,他將會被加到那些包含了生成膠合段的可重載輸入段的執(zhí)行區(qū)域。

3.2 創(chuàng)建根執(zhí)行區(qū)域

根執(zhí)行區(qū)域就是指那些執(zhí)行與加載時地址相同的區(qū)域。

當(dāng)你為映像文件指定初始化入口點(diǎn)或者由于你只使用一個 ENTRY 導(dǎo)向符而使得連接器創(chuàng)建初始化入口位置時,你就必須確保該入口點(diǎn)位于根執(zhí)行區(qū)域。如果入口點(diǎn)不在根執(zhí)行區(qū)域,連接將會失敗,連接器會報(bào)錯。

如: ENTRY point (0x00000000) lies within non-root region ER_ROM

可以通過以下方式實(shí)現(xiàn)在 scatter file 中指定根執(zhí)行區(qū)域。

顯示或缺省的指定執(zhí)行區(qū)的屬性為 ABSOLUTE ,同時使得加載區(qū)域與第一個執(zhí)行區(qū)域具有相同的地址。

使用 FIXED 屬性使得執(zhí)行區(qū)域的加載地址與其執(zhí)行時地址保持不變。

3.3 創(chuàng)建根執(zhí)行區(qū)域

可以通過在 scatter file 中為某個執(zhí)行區(qū)域指定 FIXED 屬性來實(shí)現(xiàn)該區(qū)域加載于運(yùn)行時地址保持不變。

FIXED 可以用來在一個加載區(qū)中創(chuàng)建多個根執(zhí)行區(qū)域。因此我們可以通過它實(shí)現(xiàn)把某個函數(shù)或一段數(shù)據(jù)放到目標(biāo)地址,從而可以通過指針方便地訪問該地址。比如,我們可以實(shí)現(xiàn)把常量表和 checksum 放到 ROM 上的固定地址處。

?

注意:

為了使得代碼更加易于維護(hù)和調(diào)試,請盡量少使用 scatter file 來指定放置位置,而是應(yīng)該盡可能多地讓連接器來確定函數(shù)和數(shù)據(jù)的位置。

3.3.1 怎樣把函數(shù)或數(shù)據(jù)放到指定地址

通常,編譯器處理來自單個源文件的 RO,RW, ZI 段。這些區(qū)域包括源文件的代碼與數(shù)據(jù)。如果打算把單個函數(shù)或數(shù)據(jù)項(xiàng)放到某個固定地址,我們就必須讓編譯器單獨(dú)處理這些函數(shù)和數(shù)據(jù)。

我么可以通過以下方式處理單個目標(biāo):

把函數(shù)和數(shù)據(jù)放到其源文件。

使用編譯選項(xiàng) –zo 為每個函數(shù)單獨(dú)生成一個目標(biāo)文件。 ( 參看 ARM Compiler Guide)

C,C++ 源文件內(nèi)利用 #pragma arm section 來生成多命名段。

在匯編源文件內(nèi)利用 AREA 導(dǎo)向符來生成可重載段。

3.3.2 怎樣放置單個目標(biāo)文件的內(nèi)容

3.3.3 怎樣使用 ARM section pragma

通常把函數(shù)和數(shù)據(jù)放到其源代碼文件,然后放到其目標(biāo)文件的相應(yīng)段中。然而,我們也可以 #pragma scatter file 實(shí)現(xiàn)單獨(dú)處理某個命名段。

// file adder.c

int x1 = 5; // in.data

int y1[100];// in.bss

int const z1[3] = {1,2,3}; // in.constdata

int sub1(int x)// in.text

{

return x-1;

}

#pragma arm section rwdata = "foo", code ="foo"

int x2 = 5;// in foo (data part of region)

char *s3 = "abc";// s3 in foo, "abc" in .constdata

int add1(int x)

{

return x+1;

} // in foo (.text part of region)

#pragma arm section code, rwdata // return to default placement

FLASH 0x24000000 0x4000000

{

FLASH 0x24000000 0x4000000

{

init.o (Init, +First) ; place code from init.o first

* (+RO) ; sub1(), z1[]

}

32bitRAM 0x0000

{

vectors.o (Vect, +First)

* (+RW,+ZI) ; x1, y1

}

ADDER 0x08000000

{

adder.o (foo) ; x2, string s3, and add1()

}

}

源文檔 < http://blog.csdn.net/jianshe999/archive/2008/01/25/2065080.aspx >

ARMLink scatter file(1)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 望谟县| 扬州市| 鲁山县| 青州市| 霍邱县| 阳朔县| 闸北区| 大冶市| 南澳县| 来宾市| 商丘市| 龙泉市| 囊谦县| 临猗县| 吐鲁番市| 民乐县| 临桂县| 定边县| 宁德市| 南部县| 肇源县| 桐柏县| 甘德县| 资溪县| 威信县| 榆社县| 博爱县| 镇远县| 阳江市| 鲁甸县| 临汾市| 北宁市| 安达市| 黄浦区| 益阳市| 金昌市| 门源| 山西省| 苍山县| 如东县| 海阳市|