Scatter檔案編寫

2021-07-09 20:33:37 字數 3433 閱讀 7716

乙個映像檔案中可以包含多個域(region),在載入和執行映像檔案時,每個域可以有不同的位址。每個域可以包括多達3個輸出段,每個輸出段是由若干個具有相同屬性的輸入段組成。這樣在生成映像檔案時,arm鏈結器就需要知道下述兩個資訊。

根據映像檔案中位址對映的複雜程度,有兩種方法來告訴arm鏈結器這些相關的資訊。對於映像檔案中位址對映關係比較簡單的情況,可以使用命令列選項;對於映像檔案中位址對映關係比較複雜的情況,可以使用乙個scatter配置檔案。scatter檔案又稱為分散載入檔案,將重點講解如何編寫scatter檔案。

1、scatter檔案結構

scatter檔案是乙個文字檔案,使用bnf語法來描述arm鏈結器生成映像檔案時所需要的資訊。具體來說,在scatter檔案中可以指定下列資訊:

乙個scatter檔案包含若干個載入域,乙個載入域包含若干個輸出段,乙個輸出段由若干個具有相同屬性的輸入段組成,其結構如圖1所示。

圖1 scatter檔案結構示意圖

① 載入時域的描述

載入時域包括名稱、起始位址、屬性、最大尺寸和乙個執行時域的列表。使用bnf語法描述,載入時域的格式如下所示:

load_name      base_designator         attribute      max_size

② 輸出段的描述

輸出段包括名稱、起始位址、屬性、最大尺寸和乙個輸入段的集合。使用bnf語法描述,輸出段的格式如下所示:

output_name     base_designator     attribute       max_size

③ 輸入段的描述

輸入段裡描述了乙個文字字串的模式,匹配該模式的輸入段都將被包含在當前域中。模式中可以使用匹配符,符號"*"代表零個或者多個字元,符號"?"代表單個字元。進行匹配時,所有字元是大小寫無關的。

下面介紹一些使用scatter檔案配置映像檔案位址對映模式的例子。在本例中,映像檔案包括乙個載入時域和3個連續的輸出段,這種模式適合於那些將其他程式載入到ram中的程式,如作業系統的引導程式和angel等。

例子    乙個簡單的scatter檔案 

load_1   0x4000             ;定義載入時域的名稱為load_1,起始位址為0x4000

;萬用字元*,包含了所有的ro屬性的輸入段,它們被連續放置

er_rw    + 0     ;輸出段名稱er_rw,起始位址為前乙個輸出段的結束位址加偏移量0

;本輸出段包含所有的rw屬性的輸入段,它們被連續放置

er_zi 0x5000       ;輸出段名稱er_zi,起始位址為0x5000

;本輸出段包含了所有的zi屬性的輸入段,它們被連續放置

}

按照例 scatter檔案的描述,arm鏈結器會生成相應的映像檔案位址對映關係,如圖2所示。

圖2 程式執行時位址對映關係

2、固定時域

任何乙個映像檔案都需要指定乙個初始入口點(initial entry point),它是影響檔案執行時的入口點。初始入口點必須位於乙個固定域中,所謂固定域是指該域的載入時位址和執行時位址是相同的。如果初始入口點不是位於乙個固定域中,arm鏈結器在鏈結時會產生下面的錯誤資訊。

l6203e:entry point (0x0000 0000) lies within non-root region 32 bit ram

使用scatter檔案時,可以有下面兩種方法來設定固定域。

① 設定輸出段位址

第1種方法是設定乙個載入域中第1個輸出段的執行位址,使其和該載入域的載入位址相同。這樣該輸出段就是乙個固定域。

例1就使用這種方法確定固定域。其中,載入域lr_1的起始位址為0x8000,輸出段er_ro的起始位址指定為0x8000,與載入域lr_1的起始位址相同,因此,輸出段er_ro是乙個固定域,並且是映像檔案的初始入口點。

例1 指定固定域

lr_1 0x08000                ;載入域lr_1的起始位址為0x8000

;其他部分內容

}

② 設定輸出段屬性

第2種方法通過將某個輸出段的屬性設定成fixed。

例2指定固定域

lr_1 0x8000                 ;載入時域lr_1的起始位址為0x8000

er_init 0x9000 fixed   ;設定輸出段屬性為fixed,確定固定域

;其他部分內容

}

3、乙個實際系統的例子

在乙個嵌入式裝置中,為了保持好的價效比,通常在系統中存在多種儲存器。在乙個實際的arm開發板中,可能包括片內flash、ram和片外flash、ram。在本例中,我們假設用arm晶元構造了乙個嵌入式系統,包含了8kb片內flash儲存器、16kb片內ram儲存器、起始位址為0x80000000的片外flash和起始位址為0x81000000的片外ram,其位址空間分配關係如圖3所示。

在這樣的arm系統中,我們編寫了程式,並且按照例3中的分散載入檔案對映象檔案的位址進行分配。分配後的位址映像關係如圖4所示。

圖3 arm系統中的位址空間                         圖4 位址映像關係

從圖4中可以看出:可執行**都放在片外flash中,並且vectors向量表放在片外flash的起始位址上;startup目標檔案的資料放置在片內ram中,堆疊放在片內ram的頂端;其他資料放置在片外ram中,堆空間緊跟其後。

例3 片外flash啟動程式的scatter檔案

rom_load  0x80000000                 ;定義載入區名稱rom_load,起始位址0x80000000

iram  0x40000000                     ;定義資料空間

stacks  0x40004000  uninit           ;定義堆疊空間

eram  0x81000000                     ;定義資料空間

;剩下未指定空間的所有資料

heap + 0  uninit                     ;定義堆空間

Scatter檔案分析

轉 scatter基本點 編譯後輸出的映像檔案中各段是首尾相連的,中間沒有空閒的區域,它們的先後關係是根據鏈結時引數的先後次序決定的 armlinker file1.o file2.o scatter用於將編譯後的映像檔案中的特定段載入到多個分散的指定記憶體區域 有2類域region 執行域 exe...

matplotlib之scatter自動繪製散點

1 使用matplotlib.pyplot.scatter繪製散點 2import matplotlib.pyplot as plt 3from pylab import mpl45 設定預設字型,解決中文顯示亂碼問題 6 mpl.rcparams font.sans serif simhei 78...

scatter和make blobs方法的學習

scatter x,y,s none,c none,marker none,cmap none,edgecolors none,x,y 形如shape n,輸入資料 s size,標量或形如shape n,可選,預設 20 c color,色彩或顏色序列,引數 b blue,y yellow,g g...