聊聊LiteOS中生成的Bin、HEX、ELF三種文件格式


摘要:我們在使用編譯器在編譯工程后會要求生成可執行文件,將這些文件燒錄到MCU進行運行,達到我們測試和使用程序的目的,再使用工具鏈進行編譯的時候往往生成.bin、.hex 、.elf 、.alf等文件,這些文件有什么區別呢?可以互相轉換嗎?LiteOS 有哪些可執行文件呢?本文意義進行闡述。

我們在使用編譯器在編譯工程后會要求生成可執行文件,將這些文件燒錄到MCU進行運行,達到我們測試和使用程序的目的,再使用工具鏈進行編譯的時候往往生成.bin、.hex 、.elf 、.alf等文件,這些文件有什么區別呢?可以互相轉換嗎?LiteOS 有哪些可執行文件呢?本文意義進行闡述。

BIN

bin文件,是基本的二進制文件,是flash中IO保存的基本信息,是有匯編程序直接匯編得到的二進制代碼,bin文件采用順序記錄flash中的信息,文本本身包含任任何地址信息,bin文件燒錄就是指定flash開始地址后逐個拷貝即可。利用STM32CubeProm將LiteOS編譯后生成的bin文件顯示如下圖,我們需要設定flash寫入地址才能進行燒錄。

HEX

hex文件格式是可以燒寫到單片機中,被單片機執行的一種文件格式,生成Hex文件的方式有很多種,可以通過不同的編譯器將C程序或者匯編程序編譯生成hex;最常用的Hex格式是Intel HEX文件格式,即遵循Intel HEX文件格式的ASCII文本文件,文件的每一行都包含了 一個HEX記錄。這些記錄是由一些代表機器語言代碼和常量的16進制數據組成的。Intel HEX文件常用來傳輸要存儲在ROM 或者 EPROM中的程序和數據。大部分的EPROM編程器和FLASH能使用Intel HEX文件。

上面的Huawei_LiteOS.bin對應的HEX文件如下(用notepad++打開)

:020000040800F2
:2000000000000820F50E0008650F0008650F0008650F0008650F0008650F00080000000041
:20002000000000000000000000000000650F0008650F000800000000650F0008650F0008D0
.........................................................................
.........................................................................
.........................................................................
:208E0000D883050828830508D4820508148505081C8505082485050868CC03082C850508C8
:0C8E20003485050804CD030804CD0308C8
:00000001FF

文件會有頭尾部的的說明。

文件頭部的信息

:020000040800F2

02帶邊數據長度;緊跟着后面的0x00 0x00 為地址;再后面的0x04為數據類型,類型共分以下幾類:

'00' //數據記錄
'01' //文件結束記錄
'02' //擴展段地址記錄
'03' //開始段地址記錄
'04' //擴展線性地址記錄
'05' //開始線性地址記錄
接着0x04后面的兩個 0x08 0x00就是數據,表示偏移地址,最后一個0xF2是校驗碼。

第二行開始的記錄地址和所對應的數據其格式是

:開始代碼|地址|數據類型|數據|校驗

:20|0000|00|00000820F50E0008650F0008650F0008650F0008650F0008650F000800000000|41

:20 記錄數據長度為20個字節;
0000 數據在內中的起始地址
00 記錄類型00(是一個數據記錄)
00000820F50E0008650F0008650F0008650F0008650F0008650F000800000000 數據內容
41 這一行的校驗

最后一行的內容表示文件結束記錄

:00000001FF

hex文件同一樣可以在STM32CubeProm打印出內存的內容(與之前的bin打印是一致的)。

ELF

在計算機科學中,是一種用於二進制文件、可執行文件、目標代碼、共享庫和核心轉儲格式文件,是UNIX系統實驗室(USL)作為應用程序二進制接口(Application Binary Interface,ABI)而開發和發布的,也是Linux的主要可執行文件格式。

elf(Executable and Linkable Format)可執行與可鏈接格式,是有別於hex和bin通過記錄數據的格式,elf更多而記錄程序的連接轉儲的格式文件,elf目標文件是由匯編器(assembler)和連接編輯器(link editor)生成的,內容是二進制,而非可讀的文本形式,是可以直接在處理器上運行的代碼。

簡單的理解,elf文件將二進制(bin)文件和程序描述文件打包后的一種執行文件,下載到程序里的依然是bin文件的部分,但是仿真器可以依靠其余程序表述文件來獲取程序執行的位置和二進制的對應。表意文件可以利用readelf在linux下讀取,因為我系統的原因就不贅述了。

其他可執行文件:

.asf、.o、.out這些文件都是編譯后的可執行文件,和elf以宣揚都是具有連接格式進行描述,可以利用仿真器進行仿真使用,只是編譯格式和編譯器設置的不同可以選擇不同的文件格式。

可轉換性

因為bin、hex都是只是記錄數據的,但elf類型不僅記錄數據還有程序描述,所以,elf可以轉成bin和hex使用,但是反轉。

對比一下,發現bin文件最小最簡單,但是安全性差,功能性差,hex包含頭尾和檢驗,就有很好的安全性,但是文件比bin大,功能沒有elf強大;elf功能多,但是文件最大。

LIteOS如何生成這些文件的

liteOS通過makefile進行文件編譯,也是通過makefile進行設置gcc編譯文件的輸出格式,在工程目錄下的makefile代碼中:

$(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@.elf --start-group $(LITEOS_BASELIB) --end-group
    $(OBJCOPY) -O binary $(OUT)/$@.elf $(OUT)/$@.bin
    $(OBJDUMP) -t $(OUT)/$@.elf |sort >$(OUT)/$@.sym.sorted
    $(OBJDUMP) -d $(OUT)/$@.elf >$(OUT)/$@.asm
    $(SIZE) $(OUT)/$@.elf

代碼中的解釋后的代碼

arm-none-eabi-gcc  -o xx.elf
arm-none-eabi-objcopy -O ihex xx.elf xx.hex
arm-none-eabi-objcopy -O binary xx.elf xx.bin
out --format ihex write xx.hex

通過gcc編譯的命令將結果生成為xx.elf的格式,在通過elf生成bin和hex的目標文件。

結論

在使用工程編譯結果是,最好有bin或者hex同時具有elf文件,elf用於仿真和調試,但輸出的到工廠的文件可以使用hex和bin。

 本文分享自華為雲社區《LiteOS 下載到MCU中的三種文件格式Bin、HEX、ELF》,原文作者:o0龍龍0o。

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM