Keil Assistant 插件 fromelf 文件路径报错及hex、bin、axf、elf文件之间关系

VS Code使用Keil Assistant插件编译时出现fromelf.exe路径错误

问题原因分析

如图,今天在VS Code上尝试使用Keil Assistant插件进行MDK工程编译时出现错误:

image-20221109163324345

考虑报错的原因是fromelf.exe文件的路径错误,因为在第一次clone这个工程到本地并用keil编译时,IDE端也报了这个错误。

解决方法

而我之前就是参照网上的解决方法,大家都是在keil中修改Options for target->User->After Build/Rebuild内的路径:

image-20221109163642102

修改过后,如果使用Keil编译,后处理过程正常,bin文件可以正常生成。

但是这次我已经修改过来,结果回到VS Code,还是没有办法执行后处理,依然报路径错误。

这说明我们的修改仅限于IDE,并没有修改到工程配置文件,而调用配置文件的Keil Assistant插件因为配置信息没修改,依然执行错误的路径。

然后我打开工程执行文件*.uvprojx,搜索刚刚错误的路径,找到了文件里默认记录的fromelf位置:

image-20221109164849525

修改位置,再次去VS Code执行编译下载,可以看到fromelf文件路径被修改正确,后处理执行成功:

image-20221109165039404

这也说明在我们修改IDE内的配置时,工程文件内该路径并没有被修改,可能修改信息被保存在本机工作区了,这的确很奇怪。

另外,这里介绍一下 hex文件bin文件axf文件四者的关系:

hex文件bin文件axf文件三者的关系

axf文件、hex文件与bin文件都是可以运行在单片机上的,它们都存储了编译器根据源代码生成的机器码,根据应用场合的不同,它们又有所区别。

  • axf文件:包含调试信息。axf 文件不仅包含代码数据,而且还包含着调试信息,在MDK里进行debug调试用的就是这个文件。如在Keil环境使用Debug功能时,就是先将axf文件下载到芯片内,才能进行调试。还有J-Link的J-Scope功能时,也必须使用axf文件。
  • hex文件:包含地址信息。hex 文件是一种使用十六进制符号表示的代码记录, 记录了代码应该存储到 FLASH 的哪个地址,下载器可以根据这些信息辅助下载。
  • bin文件:最直接的代码映像。bin文件是根据axf文件生成的,是最小的可以运行的文件,其包含最直接的代码映像。

三个文件包含的信息量如下表格:

文件格式保存的信息
axf (ARM Executable File)程序数据 + 地址、类型、校验等标记信息 + 调试信息
hex (Intel Hex File)程序数据 + 地址、类型、校验等标记信息
bin (Plain Binary File)程序数据

一般来说,我们对嵌入式系统进行编程,程序编译下载的过程如下。可以看出bin文件和hex文件都是最后生成用来烧录进Flash的。

img

在keil中,axf文件是编译默认生成的文件,hex文件在MDK里要勾选选项才可以生成,而bin文件则就是通过上面所说的设置使用fromelf转换工具生成的。

它们三者的大小关系是,这从他们包含的信息量也可以看出来:

image-20221109170319222

最后,既然说到fromelf,那就得说一下elf文件了。

elf文件

ELF(Executableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,是由GCC编译器生成的。elf文件可以直接转换为hexbin,但hexbin不能转换回elf文件。

综合上面所说的,elf文件可以转化为hex和bin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。

简单的理解,elf文件将二进制(bin)文件和程序描述文件打包后的一种执行文件,下载到程序里的依然是bin文件的部分,但是仿真器可以依靠其余程序表述文件来获取程序执行的位置和二进制的对应。表意文件可以利用readelf在linux下读取,因为系统的原因就不赘述了。

参考文献

[1]: 一文看懂hex文件、bin文件、axf文件的区别

[2]: bin、hex、elf、axf文件的区别

[3]: MDK错误:After Build - User command #1: C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o …\Output

[4]: Keil编译过程及程序在Flash和SRAM的空间分配

[5]: 聊聊LiteOS中生成的Bin、HEX、ELF三种文件格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Idleman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值