好工具分享_keil build viewer(附赠ARM编译过程文件简要说明)_keil-build-viewer
分享一个用于增强keil 的编译信息显示的轻量化工具,附属ARM编译过程中各种文件类型的简要说明。
小工具分享
分享一个用于增强keil 的编译信息显示的轻量化工具,在编译完成后在窗口内显示:
- 每个被编译的文件占用的RAM 和 FLASH空间大小
- 整个工程RAM 和 FLASH的使用情况,使用进度条和百分比展示
- 二次编译后,对比和上次编译的占用空间大小的差值
文件下载链接:GitHub - DinoHaw/keil-build-viewer: Keil Compilation Information Visualization Enhancement Tool keil 编译信息可视化增强工具

移植
文件下载好后,只需要将exe文件放置在keil工程文件夹中,在keil工程的user选项卡-after build中输入 keil-build-viewer.exe,然后点击编译即可。
-
支持输入参数修改选项

-OBJ显示每个文件的 RAM 和 flash 的占用信息(默认)-NOOBJ不显示每个文件的 RAM 和 flash 的占用信息-PATH显示每个文件的相对路径(默认)-NOPATH仅显示每个文件的文件名以下为 v1.5 新增功能-NOLOG不生成 log 文件-STYLE0进度条样式跟随系统(默认)-STYLE1进度条样式一:|###OOO____|(非中文环境时默认样式)-STYLE2进度条样式二:|XXXOOO____|- 以上命令不区分大小写
应用场景
- 代码大小优化
- 识别占用空间较大模块,确定大概优化方向
- 分析不同优化选项的结果
- 内存使用分析
- 确定堆栈溢出风险
- 优化RAM/FLASH的分配
- 项目维护
- 监控代码增长趋势
- 评估架构在代码量方面的变更影响
补充知识——ARM编译过程文件简要解析
该插件是利用keil编译完成后产生的标准文件分析出以上信息的,例如map中就包含各个文件占用空间的大小,只是更加精细,包含code RW ZI RO等4种数据的大小,只是该方式显示信息不太直观。那keil编译完成后有哪些文件?及这些文件作用是什么呢?

keil中主要文件类型
- Project 文件
- Source 源代码文件
- List 链接文件
- Object 目标文件
- Hex文件
- Build 编译文件
- Debugger 调试文件
- SCT 分散加载文件
Project 文件
.uvoptx文件
此文件不可删除。
- 工程管理:记录项目中的所有源文件(
.c、.h、.s)及其路径。 - 编译配置:存储编译器(ARMCC/ARMCLANG)、汇编器(ARMASM)、链接器(ARMLINK)的选项。
- 目标设备信息:指定使用的 MCU 型号(如 STM32F103C8T6)。
- 调试设置:配置调试工具(如 J-Link、ST-Link)和调试脚本(
.ini)。 - 构建目标管理:支持多个构建目标(如 Debug、Release),每个目标可以有不同的优化选项。
- 外设配置:与 CMSIS-PACK 结合,管理芯片外设(如 GPIO、UART 的初始化代码)。
.uvoptx 文件
不影响编译结果,即不干扰代码实际运行,只影响调试和开发环境,可以删除,编译后重新生成,但断点等配置会消失。
- 调试配置:存储调试器设置(如 J-Link、ST-Link 参数)。
- 断点管理:记录所有断点(地址、条件、使能状态)。
- 书签管理:保存代码中的书签位置。
- 窗口布局:记录 IDE 面板布局(如 Watch、Memory 窗口的位置)。
- 外设视图配置:存储 Peripheral Viewer 的寄存器监视设置。
- 工程选项:部分与编译无关的选项(如代码折叠状态)
Source源文件
主要是源代码文件,包含c h s等,此部分不再做过多介绍
List 链接文件
map文件
Memory Map File非常重要,在后面的文章中细致讲解
- 内存布局分析:查看 Flash(ROM)和 RAM 的占用情况。
- 符号定位:查找变量/函数的绝对地址。
- 段(Section)分析:了解代码(
.text)、数据(.data、.bss)的分布。 - 堆栈检查:评估栈(Stack)和堆(Heap)的使用情况。
- 优化依据:识别占用空间大的模块,指导代码优化。
list文件
Listing File可删除,可选择不生成,内容主要是某个源文件的源码和依赖的头文件内容,头文件内容即将该文件依赖的所有头文件内容都复制到C代码前面。
Object文件
包含代码段、数据段、调试信息(代码行数、变量类型、函数原型、变量地址映射信息)
axf文件
ARM eXecutable Format,编译生成的 完整可执行文件,包含 机器代码 + 调试信息 + 符号表,是嵌入式开发中的核心输出文件
- 烧录到芯片:通过调试器(J-Link/ST-Link)下载到 MCU 的 Flash。
- 调试基础:包含源代码关联信息,支持单步调试、变量查看。像Jscope的软件就需要使用axf文件
- 生成其他格式:可转换为
.hex、.bin等烧录文件。 - 崩溃分析:通过反汇编诊断 HardFault 等异常。
.o文件
Object File编译阶段生成的中间文件,可删除,以ELF格式保存单个源文件编译后的机器指令(ARM/Thumb 代码)、符号信息(函数和各种数据的描述),被链接器(armlink文件)合并成axf文件。
.d文件
Dependency File编译过程中自动生成的 依赖关系文件,用于记录源文件(.c/.cpp/.s)所依赖的头文件和其他源文件,确保 增量编译 的正确性。可删除,编译后再出现。
- 增量编译优化:仅重新编译修改过的文件及其依赖项。
- 头文件依赖管理:自动检测头文件变更,避免因头文件更新导致编译不一致。
- 工程健壮性:防止遗漏头文件修改引发的隐蔽错误。
.crf文件
Cross-Reference File编译过程中生成的 符号交叉引用数据库,主要用于 代码导航、符号查找和静态分析。点击define然后跳转到定义处,全靠这个。
.elf文件
Executable and Linkable Format,ARM 工具链中广泛使用的 可执行文件格式,在 Keil MDK-ARM 环境中与 .axf 文件本质相同
分散加载文件
SCT分散加载文件,虽然放在最后,但却是十分重要的一个文件,很多高级嵌入式工程师都会在这个文件上玩出花样来。该文件用于:
- 内存布局控制:定义代码、数据在 Flash 和 RAM 中的具体存放位置
- 多区域管理:处理包含多个不连续内存块的复杂内存架构
- 启动配置:指定堆栈(Stack)、堆(Heap)的大小和位置
- 特殊段定位:将特定函数或变量固定到指定地址
文件内容一般如下所示,利用该文件的功能可以开发出哪些厉害的应用呢?以下简单提两个高级应用:
- 场景1:优化关键代码性能,可以将高频访问的中断服务函数和中断向量表从Flash转移到RAM中,加速中断响应
- 场景2:管理多块RAM,分配专用DMA缓冲区到特定SRAM块
- 场景3 固件分离,可以将boot APP1 APP2安全分区
LR_IROM1 0x08000000 0x00080000 { ; 定义加载区域(Flash) ER_IROM1 0x08000000 0x00080000 { ; 执行区域 *.o (RESET, +First) ; 中断向量表必须放在起始位置 *(InRoot$$Sections) ; 编译器需要的特殊段 .ANY (+RO) ; 所有只读代码和常量 } RW_IRAM1 0x20000000 0x00020000 { ; RAM区域 .ANY (+RW +ZI) ; 读写数据和零初始化数据 } RW_IRAM2 0x10000000 0x00010000 { ; 附加RAM(如CCM) main.o (+RW +ZI) ; 将main.c的变量分配到CCM }}


