黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

ARMLink scatter file(1)

系統(tǒng) 2420 0

概述

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

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

Image$$RW$$Base,

Image$$RW$$Limit,

Image$$RO$$Base,

Image$$RO$$Limit,

Image$$ZI$$Base,

Image$$ZI$$Limit

什么時(shí)候使用 scatter file

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

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

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

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

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

5 內(nèi)存映射的 IO :采用 scatter file 可以實(shí)現(xiàn)把某個(gè)數(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)示一個(gè)整體,當(dāng)和 | 符號或復(fù)雜符號的多次重復(fù)一起使用時(shí)尤其強(qiáng)大,如( AB +(C|D) 標(biāo)示 ABC,ABD,ABABC,ABABD, …

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

ARMLink scatter file(1)

(2.1)

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

2.2.1 加載區(qū)描述

每個(gè)加載區(qū)有:

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

基地址:相對或絕對地址

屬性:可選

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

執(zhí)行區(qū)域列:確定執(zhí)行時(shí)各執(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 :相對前一個(gè)下載區(qū)域的偏移量( 4 的整數(shù)倍,如果為第一個(gè)區(qū)域)。

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

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

attribute_list PI OVERLAY ABSOLUTE FIXED UNINIT

PI: 位置獨(dú)立。

OVERLAY: 覆蓋。

ABSOLUTE: 絕對地址。

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

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

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

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

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

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

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)文件,庫文件成員,庫文件),模塊名可以使用通配符( * 匹配任意多個(gè)字符,?匹配任意一個(gè)字符),名稱不區(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 :輸入段屬性選擇子,每個(gè)選擇子以” + ”開頭,選擇子不區(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)

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

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 的一個(gè)段。

2 os_stackheap.o (heap)

heap os_stackheap.o 的一個(gè)段。

3 os_stackheap.o (stack)

stack os_stackheap.o 的一個(gè)段。

提高篇

3.1 scatter file 中指定膠合段

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

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

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

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

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

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

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

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

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

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

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

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

FIXED 可以用來在一個(gè)加載區(qū)中創(chuàng)建多個(gè)根執(zhí)行區(qū)域。因此我們可以通過它實(shí)現(xiàn)把某個(gè)函數(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ù)放到指定地址

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

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

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

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

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

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

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

3.3.3 怎樣使用 ARM section pragma

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

// 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元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論