Keil MDK本质上实现交叉编译链的功能,只是界面上采用eclipse IDE,从这个角度理解,MDK工程文件类型可以分为两类,工程本身的文件和源码编译文件。

工程文件

工程文件主要包括.uvprojx、.uvoptx、.uvguix及.crf、.dep等。

uvprojx文件

uvprojx文件就是我们平时双击打开的工程文件,它记录了整个工程的结构,如芯片类型、工程包含了哪些源文件等内容;

uvoptx文件

uvoptx文件记录了工程的配置选项,如下载器的类型、变量跟踪配置、断点位置以及当前已打开的文件等等;

uvguix文件

uvguix文件记录了MDK软件的GUI布局,如代码编辑区窗口的大小、编译输出提示窗口的位置等等。

uvprojx、uvoptx及uvguix都是使用XML格式记录的文件,若使用记事本打开可以看到XML代码,见图 1‑17。而当使用MDK软件打开时,它根据这些文件的XML记录加载工程的各种参数,使得我们每次重新打开工程时,都能恢复上一次的工作环境。这些工程参数都是当MDK正常退出时才会被写入保存,所以若MDK错误退出时(如使用Windows的任务管理器强制关闭),工程配置参数的最新更改是不会被记录的,重新打开工程时要再次配置。根据这几个文件的记录类型,可以知道uvprojx文件是最重要的,删掉它我们就无法再正常打开工程了,而uvoptx及uvguix文件并不是必须的,可以删除,重新使用MDK打开uvprojx工程文件后,会以默认参数重新创建uvoptx及uvguix文件。(所以当使用Git/SVN等代码管理的时候,往往只保留uvprojx文件)。

.crf交叉引用文件

.crf是交叉引用文件(Cross-Reference file),它主要包含了浏览信息(browse information),即源代码中的宏定义、变量及函数的定义和声明的位置。我们在代码编辑器中点击“Go To Definition Of ‘xxxx’”可实现浏览跳转,跳转的时候,MDK就是通过.crf文件查找出跳转位置的。

.dep和.d依赖文件

.dep和.d文件(Dependency file)记录的是工程或其它文件的依赖,主要记录了引用的头文件路径,其中.dep是整个工程的依赖,它以工程名命名,而.d是单个源文件的依赖,它们以对应的源文件名命名。这两个文件类似于makefile文件。这些记录使用文本格式存储,我们可直接使用记事本打开。

源码编译文件

源码编译文件主要有.s .c .h .inc .o .axf .elf .lib .bin .hex等。如下是整个嵌入式程序编译过程。

编译,MDK软件使用的编译器是armcc和armasm,它们根据每个c/c++和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code,也称目标文件),其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息;

链接,链接器armlink把各个.o文件及库文件链接成一个映像文件“.axf”或“.elf”;

格式转换,一般来说Windows或Linux系统使用链接器直接生成可执行映像文件elf后,内核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内容加载到芯片上,所以还需要对链接器生成的elf映像文件利用格式转换器fromelf转成“.bin”或“.hex”文件,交给下载器下载到芯片的FLASH或ROM中。

.o、.elf、.axf、.lib .bin及.hex目标文件这些文件都存储了编译器根据源代码生成的机器码,根据应用场合的不同,它们又有所区别。它们都是属于目标文件,都是使用ELF格式来存储的,关于ELF格式的详细内容请参考配套资料里的《ELF文件格式》文档了解,它讲解的是Linux下的ELF格式,与MDK使用的格式有小区别,但大致相同。在本教程中,仅讲解ELF文件的核心概念。