Keil-MDK程序运行和下载过程
C语言编译过程
(一)预处理
以“#”号开头的预处理指令,比如包含#include,宏定义指定#define等。在源程序中这些指令都放在函数之外,而且一般放在源文件的前面。使用预处理器把源文件(c/h)经过预处理生成xxx.i文件。(简单来说就是展开程序中的宏等)
(二)编译
指将经过预处理文件(xxx.i)之后的程序转换成特定汇编(xxx.s)代码的过程。
(三)汇编
汇编过程将上一步生成的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式。
(四)链接
链接过程使用链接器将上述目标文件与其它目标文件、库文件、启动文件等链接起来生成可执行文件。其他目标文件包括静态连接库和动态连接库。在链接的过程中分为动态链接(库代码不在可执行文件中,可执行文件包含了需要加载的库的路径信息和符号信息),静态链接(将所有目标文件和所需要的库在编译的时候一并打包进最终的可执行文件)和混合链接(既有动态链接也有混合链接)
MDK编译过程
- 编译。Keil MDK 软件使用的编译器是 armcc 和 armasm,它们根据每个 c/c++ 和汇编源文件编译成对应的以“.o”为后缀名的对象文件 (Object Code,也称目标文件),其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息。
- 链接。链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf”。
- 格式转换,一般来说 Windows 或 Linux 系统使用链接器直接生成可执行映像文件 elf 后,内核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内容加载到芯片上,所以还需要对链接器生成的 elf 映像文件利用格式转换器 fromelf 转换成“.bin”或“.hex”文件,交给下载器下载到芯片的 FLASH 或 ROM 中。最终放在Flash里的是.bin文件
STM32中程序执行的过程
将C语言编译后烧录进Flash中:
对于CPU来讲,对SRAM的访问数据要比对FLASH访问数据要快的多,所以才需要将变量这些数据放在SRAM上