前言
在嵌入式开发中,除了生成 .hex 文件,有时还需要二进制固件(.bin)或反汇编文件(.dis)用于量产烧录、IAP 升级或底层调试。本文介绍如何在 Keil MDK 中通过 fromelf 工具自动生成这两种文件。
目录
前言
一、工具简介
二、配置步骤
三、验证输出
四、应用场景
五、常见问题
六、小结
一、工具简介
ARM 编译器套件自带了fromelf工具,可对生成的 .axf 镜像进行格式转换与内容提取:
- .bin:纯二进制代码,无地址信息,适合直接烧写到 Flash 起始地址。
- .dis:反汇编文本,包含地址、机器码和汇编指令,用于分析代码布局或排查疑难 Bug。
通过 Keil 的 "Run User Programs After Build/Rebuild" 功能,可在编译成功后自动执行命令,省去手动转换的麻烦。
二、配置步骤
(1)打开工程,进入Project→Options for Target…。
(2)切换到User选项卡。
(3)在After Build/Rebuild区域,勾选Run #1和Run #2(或只勾选需要的)。
(4)在输入框中填入对应命令:
Run #1:生成 .bin 文件
fromelf --bin -o "$L@L.bin" "$L@L.axf"Run #2:生成 .dis 文件(反汇编)
fromelf --text -a -c --output="$L@L.dis" "$L@L.axf"参数说明:
$L@L:Keil 的内置变量,代表当前目标工程的文件名(不含扩展名),如my_project。我这里是test。--bin:输出纯二进制文件。--text -a -c:输出文本格式的反汇编,-a表示输出地址,-c表示混合源代码与汇编(需要编译时开启了调试信息,否则仅显示汇编)。--output:指定输出文件名。
(5)点击OK保存设置。之后每次编译(Build)成功,就会在工程目录(或 .axf 所在目录)下自动生成对应的 .bin 和 .dis 文件。
提示:如果想让 .bin 和 .dis 文件生成在指定文件夹,可将
$L@L.bin替换为相对路径,如.\Output\$L@L.bin,并确保文件夹存在。
三、验证输出
编译完成后,查看工程目录,应能看到类似以下的文件:
-my_project.bin— 可直接烧录的二进制固件。
-my_project.dis— 反汇编文本,可用记事本打开查阅。
在我这里是\test\MDK-ARM\test,里面有test.bin,test.dis。
四、应用场景
-.bin 固件
适用于:
- 串口 IAP / USB 升级时,直接传输完整二进制代码;
- 生产工具或烧录器只识别 .bin 格式;
- 需精确控制固件大小(.hex 含地址信息,体积更大)。
-.dis 反汇编
常用于:
- 分析代码在 Flash 中的实际布局;
- 排查 HardFault 等异常时的 PC 指针位置;
- 确认关键函数或中断向量表的链接顺序;
- 学习 ARM 汇编与编译器优化行为。
五、常见问题
Q: 编译报错 "fromelf 不是内部或外部命令"?
A: Keil 安装目录已包含 fromelf.exe,正常情况下会自动定位。如果失败,可检查项目路径是否包含中文或特殊字符,或将 fromelf 的完整路径(如C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe)替换命令中的fromelf。
Q: 生成的 .dis 文件只有汇编,没有源码?
A: 需要在编译时包含调试信息。进入Options for Target→Output选项卡,勾选Debug Information。此外,--text -a -c中的-c选项才启用源码混合,如果不需要源码,去掉-c即可。
六、小结
通过 Keil 的 "After Build" 自定义命令,可以轻松实现编译后自动输出 .bin 和 .dis 文件。这对嵌入式开发和调试非常实用,省去了重复的手动操作。无论是用于 IAP 在线升级,还是深入分析代码运行问题,这两个文件都能提供有力的帮助。
希望这篇短文能帮你完善编译流程。如果有其他好用的 Keil 技巧,欢迎交流分享!