Keil编译文件格式转换全解析
目录
介绍
Keil自带常用命令概览
fromelf介绍
Keil可烧录文件概述
核心差异概览
.axf文件获取
.hex文件获取
.bin文件生成
编辑
补充:生成可执行文件的汇编代码(.asm文件)
Keil自带常用命令详解
核心功能
格式转换
输出路径与文件名自动化
工作流程
介绍
首先,要明确的是:对于Before Build/Rebuild和After Build/Rebuild这样的指令,这是在Keil的User设置页面定义的用户自定义命令,它会在Build/Rebuild执行前/后自动执行。来执行用户希望的一些操作。用户在User Command中填写脚本指令,脚本可以是自己编写,也可以是Keil自带。最后通过是否勾选Run #前面的勾选框,来决定脚本是否运行。
Keil自带常用命令概览
fromelf --bin -o "$L@L.bin" "#L"fromelf --text -s -o "$L@L.sym" "#L"fromelf --text -c -o "$L@L.asm" "#L"
fromelf介绍
大家可以在类似的Keil路径下找到Keil编译所用到的工具,如下图,其中fromelf.exe用于对生成工程文件进行格式转换的,其它.exe的作用可以自行了解,本文不叙述。
Keil可烧录文件概述
上文提到fromelf.exe用于对生成工程文件进行格式转换,keil生成的可烧录文件一般是三种。
- bin文件(只有程序的二进制数据,没有任何“标签”):需手动指定起始地址。
- hex文件(Intel制定的标准十六进制文件):包含地址信息(可以直接下载)。
- axf文件(ARM芯片使用的文件格式,全称ARM Executable File):包含调试信息,debug用。
核心差异概览
特性 | .axf (ARM Executable Format) | .hex (Intel HEX) | .bin (Binary Image) |
---|---|---|---|
内容 | 机器码 + 调试信息 + 地址信息 | 机器码 + 地址信息 + 校验和 | 纯二进制机器码 |
地址信息 | ✅ 包含(调试用) | ✅ 自带存储地址(烧录自动定位) | ❌ 无(需手动指定起始地址) |
调试信息 | ✅ 完整(符号表、函数名、变量地址等) | ❌ 无 | ❌ 无 |
文件大小 | 最大(含额外调试数据) | 中等(ASCII格式,体积约为bin的2倍) | 最小(纯二进制) |
可读性 | ❌ 需专用工具解析 | ✅ 文本格式,可用记事本查看 | ❌ 二进制,需HEX编辑器查看 |
烧录方式 | 不直接烧录(需转换) | 直接烧录(工具自动解析地址) | 直接烧录(需手动输入地址) |
典型应用 | 开发调试阶段(Keil Debug/J-Link J-Scope) | 量产烧录、串口升级、通用编程器支持 | Bootloader、OTA升级、存储敏感场景 |
.axf文件获取
.axf文件,keil默认生成,使用下载器(如J-Link)下载时/Debug调试时,下载的就是.axf文件。
.hex文件获取
勾选"Create HEX File"选择框以生成hex文件。
.bin文件生成
在"After Build/Rebuild"对应的命令行添加生成。
注意:.bin文件生成的时机。
.axf文件是Build/Rebuild生成;.bin文件是由.axf文件生成的,所以这个User Command是放在After Build/Rebuild".
fromelf --bin -o "$L@L.bin" "#L"
补充:生成可执行文件的汇编代码(.asm文件)
另外,.axf文件也可以生成.asm文件,像C/C++这些高级语言一样,asm(汇编)也是编程语言的一种(底层编程语言),只不过更接近底层,必要时更能帮助开发者分析程序底层逻辑、优化性能或调试问题。
需要区分的一点是,编程语言(如C/C++,ASM)直面用户,用户可以直接编程;经编译生成的机器语言(如.axf/.hex/.bin)是硬件(如单片机)能够读懂的。
Keil自带常用命令详解
常用的也就以下三个,下面以fromelf.exe --bin -o "$L@L.bin" "#L"
详解使用方法。
命令示例 | 输出内容 | 应用场景 |
---|---|---|
fromelf --bin -o "$L@L.bin" "#L" | 二进制机器码(.bin) | 固件烧录、量产部署 |
fromelf --text -s -o "$L@L.sym" "#L" | 符号表(函数/变量地址) | 内存布局分析、链接优化 |
fromelf --text -c -o "$L@L.asm" "#L" | 反汇编代码(.asm) | 底层调试、性能调优 |
在Keil编译器中,命令 fromelf --bin -o "$L@L.bin" "#L"
主要用于在编译完成后自动将生成的 .axf
可执行文件转换为可直接烧录到嵌入式设备的二进制文件(.bin
)。以下是其详细作用及工作原理解析:
核心功能
格式转换
--bin
参数指定输出为二进制格式(.bin
),该格式仅包含纯机器码,不含调试信息或符号表,适合直接烧录到微控制器的Flash中。- 输入文件
#L
指向Keil编译生成的.axf
文件(ARM Executable Format),包含完整的程序代码、数据及调试信息。
输出路径与文件名自动化
假设.axf文件的绝对路径是:D:\project\output\app.axf
"$L@L.bin"
:动态生成输出文件的路径和名称:
$L
:表示.axf
文件的目录路径(不含文件名),例如D:\project\output\
@L
:表示.axf
文件的主文件名(不含扩展名),例如若.axf
文件为app.axf
,则@L
为app
。"$L@L.bin"
组合后输出路径如D:\project\output\app.bin
。
"#L":表示输入的.axf文件的完整地址
#L
:表示完整的.axf
文件路径(含文件名),例如D:\project\output\app.axf
。
工作流程
- 编译触发:当Keil完成代码编译并生成
.axf
文件后,该命令作为“构建后操作”(After Build/Rebuild)自动执行。 - 转换过程:
fromelf.exe
解析.axf
文件,提取纯二进制数据,生成.bin
文件,并保存到指定路径。 - 输出位置:生成的
.bin
文件默认位于与.axf
相同的目录中(通过$L
指定),文件名与工程设置的 “Name of Executable” 一致。
注意:如果编译时候报错,一般的可能是文件路径问题。注意在下面的设置页正确设置存储路径和文件名,确保输出目录存在。