> 技术文档 > 好工具分享_keil build viewer(附赠ARM编译过程文件简要说明)_keil-build-viewer

好工具分享_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分散加载文件,虽然放在最后,但却是十分重要的一个文件,很多高级嵌入式工程师都会在这个文件上玩出花样来。该文件用于:

  1. 内存布局控制:定义代码、数据在 Flash 和 RAM 中的具体存放位置
  2. 多区域管理:处理包含多个不连续内存块的复杂内存架构
  3. 启动配置:指定堆栈(Stack)、堆(Heap)的大小和位置
  4. 特殊段定位:将特定函数或变量固定到指定地址
    文件内容一般如下所示,利用该文件的功能可以开发出哪些厉害的应用呢?以下简单提两个高级应用:
  • 场景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 }}