当前位置: 首页 > news >正文

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”​​ 一致。

注意:如果编译时候报错,一般的可能是文件路径问题。注意在下面的设置页正确设置存储路径和文件名,确保输出目录存在。

http://www.dtcms.com/a/288195.html

相关文章:

  • 5 基于STM32单片机的绝缘检测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)
  • QT窗口(5)-对话框
  • 基于朴素贝叶斯的姓名性别预测系统
  • 如何构建未来的人-AI-环境智能教育生态系统
  • Java并发8--并发安全容器详解
  • 关于Vuex
  • uhd_find_devices有serial但是GNU Radio显示find no devices
  • Vue rem回顾
  • YOLOv8中添加SENet注意力机制
  • XSS-Labs 各关卡测试过程
  • 统计学习方法
  • 如何解决 ext4 文件系统的元数据损坏问题
  • 【深度强化学习】MIP-DQN 实现案例(完整Python代码)
  • [spring6: IntroductionAdvisor IntroductionInterceptor]-源码分析
  • C++编程学习(第11天)
  • Patch-wise Structural:一种引入局部统计特性的时序预测损失函数
  • eNSP综合实验(DNCP、NAT、TELET、HTTP、DNS)
  • 定时器中BDTR死区时间和刹车功能配置
  • debian的pulseaudio删掉也没事
  • Go语言pprof性能分析指南
  • SIMATIC WinCC Unified 使用 KPI 优化流程
  • 永磁同步电机无速度算法--脉振正弦注入法
  • Kakfa集群部署及主题创建
  • haproxy七层代理
  • day7--绑定媒资、课程发布
  • kafka--基础知识点--6--AR、ISR、OSR
  • Mysql系列--3、数据类型
  • RTDETR融合DECS-Net中的FFM模块
  • Verilog *2* SPI-立创逻辑派G1测试-1
  • 多表查询-8-练习总结