日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hex文件详解及常用合并方法介绍

發(fā)布時間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hex文件详解及常用合并方法介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在很多復(fù)雜的系統(tǒng)中,或者多人參與設(shè)計的系統(tǒng)中,程序分區(qū)必不可免,拿最簡單的IAP升級來說,包含兩個程序區(qū),BOOT區(qū)和APP區(qū),BOOT區(qū)的主要職責(zé)是引導(dǎo)代碼進去APP區(qū)執(zhí)行目標功能,但是在下載的時候,往往提供一個hex文件即可,提供兩個分別下載當然也可行,但是生產(chǎn)過程中增加一個工序就是一個工序的價格,再說了,完全沒必要,這就涉及到了本章介紹的hex文件合并(BIN文件當然OK的)

什么是hex文件

hex文件格式是可以燒寫到單片機中,被單片機執(zhí)行的一種文件格式,生成Hex文件的方式有很多種,可以通過不同的編譯器將C程序或者匯編程序編譯生成hex。

Hex文件格式:

先來看一下hex文件,主要截取了三部分,開頭1行

中間數(shù)據(jù),這里只截取了一部分作為表示

結(jié)尾2行

數(shù)據(jù)少不了數(shù)據(jù)格式(協(xié)議),先來看一看hex文件的數(shù)據(jù)格式,以第一行數(shù)據(jù)(020000040002f8)為例,看一看hex文件的每一字段數(shù)據(jù)是什么意思:

020000040002f8可以分解為:

0x02 0x00 0x00 0x04 0x02 0x02 0xf8,前面4個字節(jié)和最后一個字節(jié)是有特殊含義的,中間為數(shù)據(jù),每個字段的具體含義如下:

  • 第一字節(jié)0x02:數(shù)據(jù)長度,即該行有多少個數(shù)據(jù);

  • 第二、三字節(jié)0x00、0x00:表示本行數(shù)據(jù)的起始地址位;

  • 第四個字節(jié)有0x00 0x01 0x02 0x03 0x04 0x05,分別有以下含義:

'00’Data Rrecord:用來記錄數(shù)據(jù),HEX文件的大部分記錄都是數(shù)據(jù)記錄

'01’文件結(jié)束記錄:用來標識文件結(jié)束,放在文件的最后,標識HEX文件的結(jié)尾

'02’擴展段地址記錄:用來標識擴展段地址的記錄

'03’開始段地址記錄:開始段地址記錄

'04’擴展線性地址記錄:用來標識擴展線性地址的記錄

'05’開始線性地址記錄:開始線性地址記錄

最后一個字節(jié)0xf8為校驗和:校驗和= 0x100 - 累加和

單純看上面的介紹,好像也看不出和MCU的FLASH地址如何聯(lián)系起來,接下來看看是如何跟FLASH地址對應(yīng)的

第一字節(jié)表示該行的數(shù)據(jù)字節(jié)數(shù);如第1行只有 0x08 0x00 兩個字節(jié)的數(shù)據(jù),類型是 04 ,即該行記錄的是一個拓展地址(0x08 0x00 是地址信息,用法是將該地址(0x0800<<16) 后作為基地址。并且表示在下一個04類型行出現(xiàn)之前都要使用該地址。

例如第2行的地址信息是 0x0000,則表示該行數(shù)據(jù)從0x08000000( (0x0800<<16) | 0x0000 )開始記錄。

第3行則從 0x08000010 ( (0x0800<<16) | 0x0010 )開始記錄。

另外最后一個字節(jié)的校驗和 0xD2 = 0xff & ( 0x100- (0x10+4*(0x00)+0x38+0x05+…+0x00+0x08) ) = 0xff & (0x100-0x2E);

然后再看結(jié)尾部分: 類型是05,有4字節(jié)數(shù)據(jù),從上面的介紹可以知道,05是指“開始線性地址記錄”,什么意思呢?

其實就是函數(shù)入口地址,從編譯產(chǎn)生的.map文件中,可以看到Image Entry point后面跟的就是這個值

例如第2行的地址信息是 0x0000,則表示該行數(shù)據(jù)從0x08000000( (0x0800<<16) | 0x0000 )開始記錄。

第3行則從 0x08000010 ( (0x0800<<16) | 0x0010 )開始記錄。

另外最后一個字節(jié)的校驗和 0xD2 = 0xff & ( 0x100- (0x10+4*(0x00)+0x38+0x05+…+0x00+0x08) ) = 0xff & (0x100-0x2E);

然后再看結(jié)尾部分: 類型是05,有4字節(jié)數(shù)據(jù),從上面的介紹可以知道,05是指“開始線性地址記錄”,什么意思呢?

其實就是函數(shù)入口地址,從編譯產(chǎn)生的.map文件中,可以看到Image Entry point后面跟的就是這個值

最后的一行,01代表文件結(jié)束,以上就是關(guān)于hex文件的簡單介紹。

合并hex文件的幾種方法

1、傳統(tǒng)而不優(yōu)雅的直接合并法

打開我們的hex文件,就以BOOT和APP代碼為例,用記事本或者其他的軟件(notepad++等)打開

從上面的介紹我們可以知道,hex文件最后一行是代表文件的結(jié)束,那么我們只需要刪除boot文件的最后一行代碼,然后把APP的代碼直接拷貝過來

這樣我們就得到了最終的hex文件,直接燒錄進去MCU即可

2、jflash燒錄

jlink說我們必不可少的燒錄調(diào)試工具之一,一起來看看怎么使用jlink自帶的jflash工具合并

打開jflash,首先選擇我們的第一個文件,file->open data file即可

打開之后,可以看到地址是從8000000開始的,也即是我們的MCU flash的基地址

然后再點擊file->merge data file

選擇我們的第二個文件,選擇打開之后,第二個hex文件就拼接到了BOOT文件之后了,保存文件即可,建議另存為我們需要的文件名,否則的話,會默認為我們打開的第一個文件名

3、開源小工具

這個方法和上面jflash的方法類似,網(wǎng)上有很多熱心網(wǎng)友開發(fā)的小工具,也可以自己做一個,小飛哥就找一個自己測試過得給大伙用吧

軟件源碼開源,非本人所編寫,github地址為:https://github.com/SmartElec/STM32-IAP-HEX-Merge,源碼為C#所編寫。

下載下來有源碼,感興趣的就看看,不感興趣的就直接用即可,在realese文件夾內(nèi)

直接選擇我們的hex文件,注意順序

還可以同時生成bin文件,點擊合并即可

文件夾內(nèi)已經(jīng)生成了目標hex合并文件

接下來就可以把所有文件合并之后,只燒錄一個hex文件啦

經(jīng)驗交流

今天的分享就要OVER了,希望對各位小伙伴有一些幫助,有疑問的可以+小飛哥好友,一起交流學(xué)習(xí)

總結(jié)

以上是生活随笔為你收集整理的hex文件详解及常用合并方法介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。