MDK编译生成的BIN文件占用FLASH大小

本文详细介绍了如何查看STM32在MDK编译后生成的BIN文件所占用的Flash大小,包括通过资源浏览器查看文件属性、使用TotalCommander以及分析MDK编译信息。最终得出结论,最便捷的方式是利用资源浏览器类工具直接获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32烧写Flash时用到的BIN文件大小

在MDK中,通过fromelf.exe命令将hex文件转换成bin文件时,所占用的Flash空间是多大?
从哪里看呢?

1、资源浏览器中通过查看文件属性可以看到

在这里插入图片描述
上图中,大小一栏中的数字3716,即是BIN文件所占用Flash空间的大小。

2、相同功能的浏览器也可以看到

在TotalCommander中也同样可以通过文件的属性看到BIN文件的大小。
在这里插入图片描述
可以看到,BIN文件的大小同样是3716字节。

3、MDK编译后的信息中通过计算得到

在这里插入图片描述

compiling stm32f1xx_hal_cortex.c...
compiling system
<think>嗯,用户询问的是KEIL5编译生成大量子文件的原因和解决方法。这个问题涉及到嵌入式开发中的编译过程管理,需要从编译机制和工程配置角度分析。 用户可能是一位嵌入式开发者,正在使用KEIL MDK进行项目开发,突然发现工程目录里冒出来很多不明文件。这些文件让工程看起来杂乱无章,用户既担心删除重要文件又希望保持工程整洁。从问题表述看,用户已经注意到编译文件数量异常增多,但不太清楚哪些是必要的,哪些可以清理。 让我仔细梳理下KEIL编译流程中的文件生成机制。首先编译过程会分阶段产生中间文件,比如预处理阶段会生成.i文件编译阶段生成.o和.d文件,链接阶段生成.map文件等。这些文件大部分是编译过程的副产品,但有些如.axf和.hex是最终需要的目标文件。 特别值得注意的是KEIL的build过程会生成临时文件,这些文件在增量编译时能加快速度,但确实会占用空间。如果用户开启浏览信息功能,还会额外产生.browse和.crf文件用于代码导航。另外工程配置中的输出选项也会影响生成文件类型,比如是否生成汇编列表文件.lst。 针对用户困扰,需要区分两类文件:一类是编译必需的过程文件,另一类是可选生成的辅助文件。解决方案可以从工程配置优化入手,比如关闭浏览信息功能,调整输出目录结构,设置自动清理规则等。同时要提醒用户注意备份,避免误删链接脚本或启动文件等重要输入文件。 用户可能还隐含了一个需求:如何判断哪些文件可以安全删除?这需要解释不同文件的后缀名含义,比如.o是目标文件不可删,.d是依赖关系文件可重建。建议用户使用版本控制工具忽略临时文件,这是保持工程整洁的最佳实践。</think>KEIL5(MDK-ARM)在编译项目后会生成多种文件,这些文件各有其用途。理解它们的作用有助于管理工程目录,并优化存储空间: ### 📁 一、KEIL5编译后常见文件类型及原因 1. **源文件相关中间文件** * `.o` / `.obj`:**目标文件** * **原因**:编译器将每个`.c`/`.cpp`/`.s`源文件编译生成的二进制代码和符号表。链接器(Linker)将这些文件合并为最终的可执行文件。 * `.d`:**依赖关系文件** * **原因**:由编译生成,记录源文件包含的头文件路径。用于`Makefile`判断是否需要重新编译(当头文件修改时)。 * `.crf`:**交叉引用文件** * **原因**:包含符号(变量、函数)的交叉引用信息,主要用于`Go To Definition`等代码导航功能(需开启`Browse Information`选项)。 * `.i`:**预处理后文件** * **原因**:当在编译器选项中启用`Preprocessor Output`时生成,展示宏展开和头文件包含后的完整代码。 2. **链接输出文件** * `.axf`:**ARM可执行文件** * **原因**:链接器生成,包含完整的可执行代码、调试信息(DWARF格式)、符号表。是调试器直接加载的文件。 * `.hex` / `.bin`:**烧录文件** * **原因**:通过`fromelf`工具从`.axf`转换而来,是烧录到单片机Flash中的最终二进制格式。`HEX`包含地址信息,`BIN`是纯二进制。 * `.map`:**内存映射文件** * **原因**:链接器生成,详细列出代码/数据在内存中的地址分布、各模块大小、符号地址、堆栈配置等,用于分析内存使用。 3. **调试/分析文件** * `.build_log.htm`:**编译日志** * **原因**:记录编译过程的详细输出(警告、错误、命令行)。 * `.browse`:**浏览信息数据库** * **原因**:包含工程中所有符号的定义和引用位置,用于`Go To Definition`、`Find References`(需开启`Browse Information`选项)。 4. **工程/配置相关** * `.uvprojx` / `.uvoptx`:**工程文件** * **原因**:存储工程结构、文件路径、编译选项、调试设置等。`uvprojx`是主工程文件,`uvoptx`保存用户个性化设置。 * `.dep`:**工程依赖文件** * **原因**:记录工程中源文件的依赖关系。 5. **临时文件** * `__history/`:**备份目录** * **原因**:保存工程文件的旧版本备份(可在`Edit -> Configuration -> Backup`中配置)。 * `*.tmp`:**临时文件** * **原因**:编译过程中的临时工作文件,通常可安全删除。 ### 🧹 二、管理/优化生成文件的方法 1. **集中输出目录** * **操作**:在项目选项`Options for Target -> Output -> Select Folder for Objects`中指定一个目录(如`.\Objects`),将所有`.o`、`.d`、`.axf`、`.crf`等文件集中输出到该目录,避免污染源码目录。 * **效果**:源码目录保持整洁,中间文件统一管理。 2. **按类型分类输出** * **操作**:在`Options for Target -> Output`和`Listing`标签页中: * `Output Directory`:设置`.axf`、`.hex`等最终输出文件的目录。 * `Listing Directory`:设置`.lst`、`.map`等列表文件的目录。 * **效果**:文件按功能分类存放,便于查找。 3. **禁用不必要功能** * **操作**: * 关闭浏览信息:`Options for Target -> Output -> Browse Information`(取消勾选)。这会避免生成`.crf`和`.browse`文件(代价是失去部分代码导航功能)。 * 关闭预处理输出:`Options for Target -> C/C++ -> Preprocessor`(不勾选`Generate Preprocessor Output`)。 * **效果**:减少非必要文件生成。 4. **定期清理** * **手动清理**:删除`Objects`、`Listings`等输出目录下的所有内容(重新编译会自动生成)。 * **脚本自动化**:编写批处理(`.bat`)或Python脚本,在编译前自动清理旧文件。 * **KEIL内置功能**:`Project -> Clean Targets`(部分版本支持)可删除中间文件。 5. **版本控制忽略** * **操作**:在`.gitignore`或类似文件中添加忽略规则: ```gitignore # KEIL 忽略示例 Objects/ Listings/ *.axf *.hex *.bin *.map *.dep *.crf *.browse __history/ *.tmp ``` * **效果**:避免中间文件和输出文件进入版本库,节省空间并提高同步效率。 6. **优化链接器输出** * **操作**:在`Options for Target -> Linker`中: * 取消勾选`Generate Map File`(除非需要分析内存)。 * 在`Misc controls`中添加`--no_demangle`(精简符号名)。 * **效果**:减少`.map`文件大小(调试时可能需要重新启用)。 ### ⚠️ 三、重要注意事项 1. **勿删关键输入文件** * 链接脚本(`.sct`)、启动文件(`.s`)、库文件(`.lib`)是**编译输入文件**,删除会导致编译失败。 * 工程文件(`.uvprojx`, `.uvoptx`)是配置核心,必须保留。 2. **调试依赖** * `.axf`文件包含调试信息,删除后无法进行源码级调试。 * `.browse`和`.crf`文件影响代码导航功能,禁用前需权衡效率。 3. **增量编译** * 清理`.o`文件后首次编译会是**全量编译**,耗时较长,后续编译才是增量。 ### 💎 总结 KEIL5生成的多文件编译流程各阶段的自然产物:`.o`是编译结果,`.axf`是链接结果,`.hex`是最终烧录文件,`.map`用于内存分析,`.crf/.browse`支持代码导航。通过**集中输出目录**、**禁用非必需功能**(如浏览信息)、**版本控制忽略**和**定期清理**,可有效管理工程目录。理解文件用途后,即可安全清理非必要文件,保持项目整洁[^1][^2]。 --- ### ❓相关问题 1. KEIL5中`.map`文件如何解读内存使用情况? 2. 如何配置KEIL5以生成最小尺寸的HEX/BIN文件? 3. KEIL5的增量编译机制如何提升开发效率? 4. 为什么KEIL工程需要链接脚本(Scatter File)?如何配置? 5. KEIL5与IAR在编译输出文件管理上有何差异? [^1]: 编译过程本质是将高级语言逐层转换为机器可执行代码,中间产生多种过渡文件是必然的。 [^2]: 开发环境如KEIL、IAR会生成丰富的中间文件以支持编译、链接、调试等完整工作流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值