VS Code使用Keil Assistant插件编译时出现fromelf.exe路径错误
问题原因分析
如图,今天在VS Code上尝试使用Keil Assistant
插件进行MDK工程编译时出现错误:
考虑报错的原因是fromelf.exe
文件的路径错误,因为在第一次clone这个工程到本地并用keil编译时,IDE端也报了这个错误。
解决方法
而我之前就是参照网上的解决方法,大家都是在keil中修改Options for target
->User
->After Build/Rebuild
内的路径:
修改过后,如果使用Keil编译,后处理过程正常,bin文件可以正常生成。
但是这次我已经修改过来,结果回到VS Code,还是没有办法执行后处理,依然报路径错误。
这说明我们的修改仅限于IDE,并没有修改到工程配置文件,而调用配置文件的Keil Assistant插件因为配置信息没修改,依然执行错误的路径。
然后我打开工程执行文件*.uvprojx
,搜索刚刚错误的路径,找到了文件里默认记录的fromelf
位置:
修改位置,再次去VS Code执行编译下载,可以看到fromelf
文件路径被修改正确,后处理执行成功:
这也说明在我们修改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的。
在keil中,axf文件
是编译默认生成的文件,hex文件
在MDK里要勾选选项才可以生成,而bin文件
则就是通过上面所说的设置使用fromelf
转换工具生成的。
它们三者的大小关系是,这从他们包含的信息量也可以看出来:
最后,既然说到fromelf
,那就得说一下elf文件
了。
elf文件
ELF(Executableand linking format)文件
是x86 Linux系统下的一种常用目标文件(objectfile)格式,是由GCC编译器生成的。elf文件
可以直接转换为hex
和bin
,但hex
和bin
不能转换回elf
文件。
综合上面所说的,elf文件可以转化为hex和bin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。
简单的理解,elf文件将二进制(bin)文件和程序描述文件打包后的一种执行文件,下载到程序里的依然是bin文件的部分,但是仿真器可以依靠其余程序表述文件来获取程序执行的位置和二进制的对应。表意文件可以利用readelf在linux下读取,因为系统的原因就不赘述了。
参考文献
[2]: bin、hex、elf、axf文件的区别
[3]: MDK错误:After Build - User command #1: C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o …\Output