?
嵌入式系統編程文件格式多種多樣。為方便嵌入式系統開發和深度理解各種目標系統,論文詳細分析了多種主流的嵌入式可執行文件(即機器碼文件)格式。比較了不同格式的異同點,并介紹了各種嵌入式文件格式的主要硬件系統及目標器件。
1 常見文件格式解析
雖然不同的開發集成環境和不同的硬件架構使得嵌入式設備中可執行文件的格式不盡相同,但基本上包含以下一些典型特征:
?、?可執行文件的基本信息,如文件大小、時間、權限等。
?、?與硬件架構相關的二進制代碼和數據。
?、?符號表與符號重定位表。
從文件本身所包含的信息來看,嵌入式系統可執行文件主要有:純數據類文件,記錄類文件以及描述類文件。
1.1 純數據文件格式
純數據文件就是指文件中不包含地址和校驗信息等,只包含純粹的用戶數據。純數據文件主要包括兩種:BIN格式和HEX格式。BIN格式即二進制的文件,使用時每8位作為一個字節來用,傳輸BIN文件時并不進行ASCII編碼。BIN文件格式是沒有結束標記的。顯然,BIN文件格式是除了一些壓縮格式(如ZIP和RAR)之外最節省空間的格式,它主要是用來編程存儲器器件的,通常會建議將EPROM數據存儲為BIN格式以作為標準文件格式來下載[2].HEX格式相比BIN格式的區別就是,每個字節都轉成了2個0~9和A~F之間值的ASCII碼。整個文件是分行表示的,每行一般是16或32個字節,行以空格加回車表示結束。
1.2 記錄類文件格式
記錄類文件中所有的數據行都叫做記錄,每一條記錄一般都分為多個域來清晰地說明記錄的類型、記錄中數據的數量、數據的存儲地址、數據校驗信息等。而且,記錄類文件一般都有關于該文件開始和結束的標記信息。各種記錄類文件格式的差異就體現在不同公司定義的記錄標記以及一些域格式和順序的差別上。記錄類文件常見的就是各種MCU的燒錄文件。
1.2.1 Intel HEX文件格式(.HEX)
Intel HEX是一種較老的文件格式。它是用ASCII字符來表示文件中數據域的二進制數據。文件中每一行是一條HEX記錄,由一個回車和一個換行結束。Intel HEX文件經常被用于將程序或數據傳輸存儲到ROM、EPROM,大多數編程器和模擬器使用Intel HEX文件。
記錄格式如下:
:BBAAAATTHHHH…HHHCC
:--記錄開始標記。
BB--長度域,占一個字節。代表這條記錄中數據的字節數,每條記錄最大數據字節數是255字節,通常為32字節。長度域只計數數據域的大小。
AAAA--地址域,占兩個字節,存儲方式是MSB.地址域指出這條記錄的第一個數據字節的地址,隨后地址逐一增加以存儲下面的數據。整個文件中各記錄的地址順序是不重要的,文件中有時也會有一段空的地址。
TT--類型域,1字節。表示該條記錄的類型。
HH--數據域,長度受到記錄類型的限制。數據記錄以字節為單位。
CC--校驗和,占一個字節。計算方法是將本記錄中除了冒號和校驗字節之外的所有字節加起來,將模除256得到的余數取補碼。
Intel HEX文件格式的6種記錄說明如表1所列。
表1 Intel HEX文件格式的記錄類型

?
1.2.2 Motorola S/EXORciser/EXORmacs/32位格式
Motorola公司的產品主要基于Motorola S記錄格式,這種文件格式以一種可打印的格式編碼程序和數據文件來實現計算機系統間的傳輸,可以使下載文件實現可視化編輯。S記錄由特殊排列的一串ASCII字符序列組成,最大長度為78字節。一個文件內的S記錄一般沒有特定的順序要求。目前主要有3種S記錄文件格式:S19格式,地址域是16位,最大可寫64 Kb的文件;S28格式,地址域24位,最大可寫16 Mb的文件;S37格式,地址域32位,最大可寫4 Gb的文件。
S記錄的一般格式是:類型域--長度域--地址域--數據域--校驗和。S記錄的各種記錄類型有不同的格式和意義,具體如表2所列。
Motorola S19(又稱Motorola EXORciser)格式是以S0記錄開始,數據記錄都是以S1標識的2字節地址類型的記錄,S9標識結束記錄格式。Motorola S28(又稱Motorola EXORmacs)格式是以S0記錄開始,數據記錄都是以S2標識的3字節地址類型的記錄,S8標識結束記錄格式。Motorola S37(又稱Motorola 32位)格式是以S0記錄開始,數據記錄以S3字符標識的4字節地址類型的記錄,S7標識的結束記錄格式。
表2 S記錄的記錄類型

?
1.2.3 TektrONix HEX/擴展的Tektronix HEX格式
Tektronix HEX格式如下所示:
/AAAABBEEDDDDDDDDCC
/:記錄開始標記符。
AAAA:地址域。占兩個字節,記錄了第一個數據字節的地址。
BB:長度域。占1個字節,因此每條記錄的最大數據個數為255字節。
EE:地址和長度數據的校驗和域。大小為1個字節。
DD:數據域。最大為255個數據字節,但一般記錄中為32個字節。
CC:數據的校驗和域。
文件的結束記錄中包括記錄開始符("/")、傳輸地址、數值為"00"的長度以及傳輸地址和長度的校驗和字節。一種可選擇的中斷記錄以2個開始符("http://")為記錄開始,接著是一串任意的ASCII字符串。
擴展的Tektronix HEX相對Tektronix HEX格式具有較為靈活的記錄類型和地址空間。它包括3種類型的記錄:數據、符號和結束記錄。數據記錄中的是目標代碼;符號記錄中的是編程部分的信息,編程器下載時符號記錄是被忽略的;結束記錄包括頭部、下載地址和目標代碼。
擴展的Tektronix HEX格式模型如下:
%BBMEEAAAAADDDDDD---DCC
%:占1個ASCII字符,標示擴展Tek HEX記錄開始。
BB:長度域。占1個字節,表示該記錄中除開始標志之外的字節數。
M:類型域,一個ASCII字符。類型域中:6代表數據記錄,3代表符號記錄,8代表結束記錄。
EE:地址和長度數據的校驗和,大小為1個字節。
AAAAA:地址域。地址域包括2~17個字符,第1個字符決定了地址的長度,一般為8,0代表16個字符的地址長度。地址域第1個字符之外的字符指出了數據在存儲器存放的地址。
DD:數據域。包括可執行代碼,下載到存儲器的數據以及傳輸中的描述信息。
CC:校驗和,占一個字節。校驗和域對本條記錄中除了"%"和校驗數據本身之外的所有數據計算校驗和。
根據是否有數據和結束記錄,記錄中域的數量是不一樣的,2種記錄都有6個字符的頭以及2~17個字符的地址。
1.3 描述類文件格式
描述類文件格式的文件信息有相對豐富的文件格式,文件不僅有關于數據的記錄信息,還包含了關于目標機的一些說明信息,改變硬件結構的信息或者測試信息等。該類型的文件最常見的是用于PLD和FPGA的下載文件。
1.3.1 JEDEC 文件
JEDEC(Joint Electron Device Engineering Council)標準是用于現場可編程邏輯器件的。該標準定義了在開發系統和編程器之間傳輸熔絲狀態的數據格式。它并不涉及諸如邏輯陣列類型和輸出宏單元等設備結構信息?,F場可編程邏輯器件比可編程的存儲器件需要更多的測試信息,所以該標準還定義了一些簡單的測試格式。JEDEC格式的合法字符包括所有可打印的ASCII字符和4個控制字符,包括STX(Start of Text)、ETX(End of Text)、CR(Carriage Return)和LF(Line Feed)。一般使用BNF(BackusNaur Form,巴科斯諾爾范式)來定義JEDEC格式的語法。
JEDEC格式的第1個域是強制的關于設備信息設計規格書,這個域沒有開始標記符。在JEDEC文件中每一個域都有域識別符以指明該域的類型,每一個域都是以星號結束。JEDEC文件各種域識別符如表3所列。
描述及定義域主要用來說明用戶和廠商信息、日期和版本號等各種信息。
N--說明域。用來在JEDEC文件傳輸中插入說明信息,編程器是忽略這一域的。
D--器件域。編程器支持的器件并不是遵從這一域,而是由QF和QP域以及手動選擇器件而決定。
QF,QP和QV--數值域。QF子域定義了器件中熔絲的數量,在器件編程或者測試域之前,這些數值域都是必須的;只有測試域的文件不需要QF域,編程數據的文件不需要QP和QV域;QF子域向編程器指出了熔絲數據需要多少存儲器,多少熔絲要被設置到初始條件以及計算校驗和所包含的熔絲數;QP子域定義了測試向量中的引腳數目或者測試條件;QV子域指出了測試向量的最大數。
器件編程域。每一個熔絲有2種可能的狀態:0為低阻連接,1為高阻連接。熔絲編號從0開始一直到最大熔絲數目。L域中L之后是該域第一個熔絲的十進制序號數字,接下來就是指示熔絲狀態的二進制數字列表,熔絲號和熔絲列表之間由空格或者回車分開。F域定義了L域中未明確定義的熔絲狀態信息。C域是把從第一個熔絲開始的整個器件的熔絲狀態每8位作為一個字節來計算的,最后一個字中若有未使用的位則填0.U域允許指定JEDEC文件中的不影響邏輯和電特性的用戶數據熔絲。E域允許定義不影響器件邏輯功能也不影響已有的JEDEC文件的特性,數據可以用二進制或者十六進制來表示。J--器件標識域。提供邏輯識別碼指出文件對應器件的邏輯結構,由以空格分開的分別大于等于0的2個十進制數組成:第1個是結構碼,第2個是引腳碼。J域中的編碼是由JEDEC組織分配的。
設備測試域。功能性的測試由測試向量包含的測試條件來定義,每一個測試向量包括n個測試條件。n是器件引腳數,測試條件如表4所列。
X--默認測試條件域。定義了未精確定義的測試向量的輸入邏輯電平,即把QV域中的測試向量1設置為默認輸入測試條件。若使用X域,應當在QV和QP域之后第一個測試向量之前。V--測試向量域。由十進制的向量編號開始,之后是空格以及每個引腳的一串測試條件。P--Pin引腳序列域。P域映射出了器件輸出引腳,一般和V域一起使用。代碼如下所示:
P 1 2 3 4 5 6 14 15 16 17 7 8 9 10 11 12 13 18 19 20 *
V0001 111000HLHHNNNNNNNNNN*
V0002 100000HHHLNNNNNNNNNN*
編程及測試選項類域:G為熔絲安全域。用來使能某些邏輯器件的加密熔絲,在G域發送1,即G1*;R、S、T為屬性分析測試;A為訪問時間域,定義了測試向量在十億分之一秒內的傳播延時。
表3 JEDEC文件各種域識別符

?
表4 設備引腳的各種測試條件

?
1.3.2 POF文件
POF文件中的包類型如表5所列。POF(Programmer Object File, 編程目標文件) 格式提供高度壓縮的數據文件,可方便有效地傳輸大量的邏輯器件編程信息。這種文件目前主要應用于MAX系列器件。POF文件由文件頭和各種包組成,每個包對應一個標記,指出包中的數據類型以及數據本身結構,各個包的長度和結構各異。每個數據包的最前6個字節是包類型和其余字節的數量。編程設備在讀取POF文件時,若包類型未被識別,則該包棄之不用。在一個POF文件中,除了結束標記包外,各種類型都可多次出現。有些包編程器是需要包中信息的,有些包編程器是不使用的(跳過),有些包則是編程器只讀包中信息但不直接應用該信息的(只讀)。
表5 POF文件中的包類型

?
2 總結
為方便用戶使用,目前大多數主流公司生產的編程器都能夠在下載文件時自動進行某幾種文件格式的檢測識別以及文件格式的轉換。然而這畢竟解決不了文件格式之間互不兼容的實際問題。因此,我們期望在未來幾年內文件格式可以逐步走向統一,擁有一種或少數幾種格式標準。
評論