聊聊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。
聊聊LiteOS中生成的Bin、HEX、ELF三种文件格式的更多相关文章
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...
- 转 Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式 velocitypropertiespath Velocity中加载vm文件的三种方式: 方式一:加载classpath目录下的vm文件 Prope ...
- Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式: a. 加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...
- 在网页中JS函数自动执行常用三种方法
在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: <SCRIPT LANGUAGE="JavaScript"> function ...
- shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
fork ( /directory/script.sh) fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本. 运行的时候开一个sub- ...
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)——转载
原文链接:http://blog.chinaunix.net/uid-22548820-id-3181798.html fork ( /directory/script.sh) :如果shell中包含 ...
- C++中复制构造函数被调用的三种情况
C++中的构造函数 c++中的构造函数分为构造函数,和复制构造函数,相比于构造函数,复制构造函数使用更加方便,快捷.构造函数可以有多个,二复制构造函数只能有一个,因为复制构造函数的参数只能是当前类的一 ...
- PHP生成word文档的三种实现方式
PHP生成word原理 利用windows下面的 com组件 利用PHP将内容写入doc文件之中 具体实现: 利用windows下面的 com组件 原理:com作为PHP的一个扩展类,安装过offic ...
- Binding 中 Elementname,Source,RelativeSource 三种绑定的方式
在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...
随机推荐
- 如何将linux设置成网关
如何将linux设置成网关 打开网关linux的端口转发功能:echo '1' > /proc/sys/net/ipv4/ip_forward 在VMWare中创建一个仅主机的内网: 进入本机配 ...
- Fox and Minimal path 题解
Fox and Minimal path 题目大意 构造一张无向图,使得从 \(1\) 到 \(2\) 的最短路数量为 \(k\). 思路分析 我们首先可以发现当 \(k = 2^t\) 时的构造方式 ...
- 使用卷积神经网络训练手写数字识别模型(CNN)
https://www.cnblogs.com/zylyehuo/ 效果展示 目录结构 README.md # Basic MNIST Example pip install -r requireme ...
- Go命令大全:全面解析与实践
本文详尽地探讨了Go语言的内建命令集,包括但不限于go build.go run.go get等.文章首先列举了所有常用的Go命令,并用表格形式简洁地解释了它们的功能.随后,我们逐一深入讲解了每个命令 ...
- PTA乙级1038C++哈希解法
#include"bits/stdc++.h" using namespace std; int main() { int a,b[105]={0}; long i,n,K; ci ...
- Dapper.Lite 扩展
最近重构并精简了Dapper.Lite,然后把不依赖Dapper的版本LiteSql也重构了一下,和Dapper.Lite保持一致.感觉这两款ORM基本完工,自荐一下. .NET的ORM虽多,堪用的不 ...
- disabled_button
根据题目提示,是前端的知识 进入页面,flag按钮灰了按不下去 右键检查发现按钮地方的样式,发现有一个disabled,这里就直接把他删掉点击回车就可以点击了
- Ubuntu 20.04 使用 socat 转发特定端口
安装socat apt install socat 根据需求确定要转发的端口 比如,我的需求是监听IPv6的某一TCP端口,并转发至局域网内某一特定主机,可以使用以下命令: socat TCP6-LI ...
- 总结(6)--- python基础知识点小结(细全)
==================================================================================================== ...
- 【GIT】学习day03 | 如何生成并配置SSH公钥【外包杯】
快速笔记: 1.注册并激活码云账号 2.生成并配置SSH公钥(运行ssh -t git@gitee.com 检测SSH公钥是否配置成功) 3.创建空白的码云仓库 4.把本地项目上传到码云对应的空白仓库 ...