Hex、Bin文件解讀

做過單片機開發的朋友應該對hex和bin文件都比較眼熟了,但你是否真正理解這兩種文件的區別和聯繫嗎?今天我想總結一下,做個備忘。水平所限,如有疏漏,歡迎指正。

簡單來說,我們的源代碼經過單片機編譯器編譯後,會輸出只有CPU能識別的二進制機器碼,這也就是bin文件裏面的內容。bin文件需要燒寫到Flash(Rom)裏才能運行。那這些二進制數據應該怎麼燒寫以及燒寫到Flash裏的哪塊區域呢?這就需要hex文件登場了。所以,也可以這樣說,hex文件是bin文件的詳細描述,裏面添加了二進制數據在Flash中的對應區域地址等信息。

首先要明確一點,bin文件是二進制(也可以說是16進制)文件,但是hex文件可是文本文件(ASSICII格式),並且內容是以行爲單位組織的。每兩個字符表示16進制的值,比如,bin中的一個字節數據0xFF,在hex文件中表示爲字符串“FF”,佔兩個字節,所以hex文件比bin文件要大很多。下面重點說一下hex文件的格式,不同編譯器輸出的hex文件可能會稍微有點不同,但基本格式都是一樣的,它包含這幾部分:

Head + Len + Offset + Type + Data + Checksum
  • Head
    佔1個字符,固定爲冒號“:”。

  • Len
    佔2個字符,其轉化成16機制數的值代表Data域的字節數長度。

  • Offset
    佔4個字符,代表地址偏移數。

  • Type
    佔2個字符,用來表示本行內容的類別,它有6種取值:

    1. “00”:數據記錄,用來記錄bin文件中的數據,Hex文件的大部分內容都是數據記錄
    2. “01”:文件結束記錄,用來標識文件結束,放在文件的最後,標識Hex文件的結尾
    3. “02”:擴展段地址記錄,用來標識擴展段地址的記錄
    4. “03”:開始段地址記錄,開始段地址記錄
    5. “04”:擴展線性地址記錄,用來標識擴展線性地址的記錄
    6. “05”:開始線性地址記錄,開始線性地址記錄
  • Data
    佔Len*2個字符,代表bin文件中的數據。

  • Checksum
    佔2個字符,代表本行數據的檢驗碼,計算方法爲:檢驗和 = 0xFF & (0x100 - 冒號之後的各字節數據的累加和)。

單純用文字講清楚hex的每部分的含義比較抽象,尤其是Type的分類,不好描述,咱就舉例子說明吧,這樣最簡單明瞭。針對6種Type,每1類1個例子,對照結構來分析:

  1. : 10 01F0 00 C0E0C0D075D000C000C007309904C299 DB
    Type爲“00”,所以這一行爲數據記錄;長度爲0x10(即16),可以數一下Data段確實爲16個字節;檢驗碼爲DB,按照計算公式算出來也沒毛病;Offset爲0x01F0,如果本行前面沒有擴展段地址記錄或擴展線性地址記錄,則表示Data域的數據燒寫到Flash的地址0x01F0處,如果前面有這兩類記錄,其意義下面再說。

  2. : 00 0000 01 FF
    Type爲“01”,表示這是hex文件結尾,在最後一行。

  3. : 02 0010 02 0010 24
    Type爲“02”,所以這一行爲擴展段地址記錄,擴展段地址爲0x0010,它表示該行以後的數據記錄燒寫地址爲:0x0010 x 0x0F + Offset。如果1中的那行數據之前有這個擴展段地址記錄,那麼1中的數據燒寫地址變爲:0x0010 x 0x0F + 0x01F0 = 0x02E0。

  4. : 04 0000 03 00003800 C1
    Type爲“03”,表示該行爲開始段地址記錄,這一類很少見,我在我的hex文件中沒找到,寫一個網上的例子,它指定程序起始執行地址,對於80x86處理器,可指定CS:IP寄存器的初始內容,Offset字段是0x0000,Len始終爲4,Data的前兩個字節代表CS寄存器的值,後兩個字節代表IP值。

  5. : 02 0000 04 0800 F2
    Type爲“04”,表示該行爲擴展線性地址記錄。因爲Offset只有兩個字節,表示的地址範圍有線,所以對於空間比較大的情況,可以用“04”指定擴展地址,表示地址的高位,這樣地址就可以用4個字節表示了。本例中指定的地址高位爲0x0800,如果1中的那行數據之前有這個擴展線性地址記錄,那麼1中的數據燒寫地址變爲:0x0800 << 0x0F + 0x01F0 = 0x080002E0。

  6. : 04 0000 05 08000189 65
    Type爲“05”,表示該行爲開始線性地址記錄,一般表示程序的入口地址,比如該例子中的地址爲0x08000189,可以在Map文件中找到。

說到底,其實燒寫工具就是根據hex文件的描述,get到程序數據和地址,然後逐個燒寫到Flash中對應的區域。好了,先寫這麼多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章