MDK(Keil μVision 5)的编译过程及文件类型全解

MDK(Keil μVision 5)的编译过程及文件类型全解

一、编译过程

MDK的编译过程主要分为 预处理、编译、汇编、链接、生成可执行文件、格式转换 六个阶段。以下是详细流程:

  1. 预处理(Preprocessing)
    • 工具: armcc(ARM C/C++ 编译器)
    • 输入文件: .c(C源文件)、.h(头文件)
    • 输出文件: .i(预处理后的临时文件,默认不保存)
    • 作用: 展开宏、处理条件编译指令(如 #ifdef)、合并头文件到源文件中。
  2. 编译(Compilation)
    • 工具: armcc
    • 输入文件: 预处理后的 .i 文件
    • 输出文件: .s(生成的汇编文件,默认不保存)
    • 作用: 将C/C++代码翻译成ARM汇编指令。
  3. 汇编(Assembly)
    • 工具: armasm(ARM汇编器)
    • 输入文件: .s(汇编文件)或用户编写的 .s(如启动文件 startup_xxx.s
    • 输出文件: .o.obj(目标文件)
    • 作用: 将汇编代码转换为机器码(二进制目标文件)。
  4. 链接(Linking)
    • 工具: armlink(ARM链接器)
    • 输入文件: 所有 .o/.obj 文件、库文件(.lib)、分散加载文件(.sct
    • 输出文件: .axf(ELF格式的可执行文件,含调试信息)
    • 作用: 合并目标文件、分配内存地址(代码段、数据段)、解析符号引用。
    • 关键文件:
      • .sct 分散加载文件: 定义内存布局(如Flash和RAM的地址范围),类似GCC的 .ld 文件。
  5. 生成可执行文件(ELF格式)
    • 文件: .axf
    • 内容: 包含调试信息(符号表、源码行号)、机器码、内存分配表等,用于调试和烧录。
  6. 格式转换(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进行开发和调试。

你可能感兴趣的:(工具,arm,stm32)