MDK(Keil μVision 5)的编译过程及文件类型全解
一、编译过程
MDK的编译过程主要分为 预处理、编译、汇编、链接、生成可执行文件、格式转换 六个阶段。以下是详细流程:
- 预处理(Preprocessing)
- 工具:
armcc
(ARM C/C++ 编译器) - 输入文件:
.c
(C源文件)、.h
(头文件) - 输出文件:
.i
(预处理后的临时文件,默认不保存) - 作用: 展开宏、处理条件编译指令(如
#ifdef
)、合并头文件到源文件中。
- 工具:
- 编译(Compilation)
- 工具:
armcc
- 输入文件: 预处理后的
.i
文件 - 输出文件:
.s
(生成的汇编文件,默认不保存) - 作用: 将C/C++代码翻译成ARM汇编指令。
- 工具:
- 汇编(Assembly)
- 工具:
armasm
(ARM汇编器) - 输入文件:
.s
(汇编文件)或用户编写的.s
(如启动文件startup_xxx.s
) - 输出文件:
.o
或.obj
(目标文件) - 作用: 将汇编代码转换为机器码(二进制目标文件)。
- 工具:
- 链接(Linking)
- 工具:
armlink
(ARM链接器) - 输入文件: 所有
.o/.obj
文件、库文件(.lib
)、分散加载文件(.sct
) - 输出文件:
.axf
(ELF格式的可执行文件,含调试信息) - 作用: 合并目标文件、分配内存地址(代码段、数据段)、解析符号引用。
- 关键文件:
.sct
分散加载文件: 定义内存布局(如Flash和RAM的地址范围),类似GCC的.ld
文件。
- 工具:
- 生成可执行文件(ELF格式)
- 文件:
.axf
- 内容: 包含调试信息(符号表、源码行号)、机器码、内存分配表等,用于调试和烧录。
- 文件:
- 格式转换(Hex/Bin生成)
- 工具:
fromelf
(ARM工具链) - 输入文件:
.axf
- 输出文件:
.hex
(Intel HEX格式,用于烧录).bin
(纯二进制镜像,可直接写入Flash)
- 作用: 将ELF文件转换为烧录工具支持的格式。
- 工具:
二、文件类型全解
文件类型 | 扩展名 | 作用与说明 |
---|---|---|
项目文件 | .uvprojx | Keil项目文件,保存工程配置(如芯片型号、编译选项、文件结构)。 |
源文件 | .c 、.cpp | C/C++源代码文件。 |
头文件 | .h | C/C++头文件,声明函数、宏、结构体等。 |
汇编文件 | .s | ARM汇编源文件(如启动文件 startup_xxx.s )。 |
汇编头文件 | .inc | 汇编语言的头文件,包含寄存器定义或宏。 |
目标文件 | .o 或 .obj | 编译后的二进制目标文件,含机器码和未解析的符号。 |
可执行文件 | .axf | ELF格式的可执行文件,含调试信息和内存分配表,用于调试和烧录。 |
Hex文件 | .hex | Intel HEX格式文件,烧录到Flash的标准格式。 |
Bin文件 | .bin | 纯二进制镜像文件,直接写入MCU的Flash。 |
链接器脚本 | .sct | 分散加载文件,定义内存布局(如Flash、RAM的分区)。 |
映射文件 | .map | 链接生成的文本文件,记录代码/数据的地址、大小、内存使用统计。 |
列表文件 | .lst | 汇编器生成的文本文件,显示汇编代码与机器码的对应关系。 |
依赖文件 | .d | 记录源文件的头文件依赖关系,用于增量编译。 |
交叉引用文件 | .crf | 符号交叉引用表,用于IDE中快速跳转到定义或引用位置。 |
调试脚本 | .ini | 调试配置脚本(如初始化硬件、配置内存)。 |
库文件 | .lib | 预编译的静态库文件,包含可重用的代码模块。 |
三、关键工具链
armcc
: C/C++编译器(支持ARM语法和优化选项)。armasm
: 汇编器,处理ARM/Thumb指令。armlink
: 链接器,合并目标文件并分配内存。fromelf
: 格式转换工具,生成Hex/Bin文件。
四、编译选项与辅助文件
- 生成
.map
文件: 在链接选项中勾选Generate Map File
。 - 生成
.lst
文件: 在汇编器选项中启用Listing
。 - 调试信息:
.axf
包含DWARF格式的调试数据,支持Keil调试器的源码级调试。
五、常见流程示意图
复制
[.c/.h] → (预处理) → [.i] → (编译) → [.s] → (汇编) → [.o]↘ (链接 + .sct) → [.axf] → (fromelf) → [.hex/.bin]↗
[.s] → (汇编) → [.o]
通过理解上述流程和文件类型,可以更高效地使用Keil MDK进行开发和调试。