摘要:咱们在应用编译器在编译工程后会要求生成可执行文件,将这些文件烧录到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.elfarm-none-eabi-objcopy -O ihex xx.elf xx.hexarm-none-eabi-objcopy -O binary xx.elf xx.binout --format ihex write xx.hex

通过gcc编译的命令将后果生成为xx.elf的格局,在通过elf生成bin和hex的指标文件。

论断

在应用工程编译后果是,最好有bin或者hex同时具备elf文件,elf用于仿真和调试,但输入的到工厂的文件能够应用hex和bin。

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