乐趣区

关于iot:聊聊LiteOS中生成的BinHEXELF三种文件格式

摘要:咱们在应用编译器在编译工程后会要求生成可执行文件,将这些文件烧录到 MCU 进行运行,达到咱们测试和应用程序的目标,再应用工具链进行编译的时候往往生成.bin、.hex、.elf、.alf 等文件,这些文件有什么区别呢?能够相互转换吗?LiteOS 有哪些可执行文件呢?本文意义进行论述。

本文分享自华为云社区《LiteOS 下载到 MCU 中的三种文件格式 Bin、HEX、ELF》,原文作者:o0 龙龙 0o。

咱们在应用编译器在编译工程后会要求生成可执行文件,将这些文件烧录到 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。

点击关注,第一工夫理解华为云陈腐技术~

退出移动版