MDK程序组成、存储与运行

MDK程序的编译过程


MDK程序从C/C++代码、汇编代码到二进制文件经历一下几个步骤:

MDK编译过程

经过编译器处理得到了.o对象代码,然后使用链接器链接得到了.axf映像文件,这时在映像文件中给变量分配好了地址。得到.axf文件后,只需要通过fromelf格式转换便可得到最终写入到flash中的程序了

MDK程序的存储与运行


单片机程序考虑加载(Loading)和执行(Executing)两种状态,下图为两种状态下数据存储情况

程序加载、运行视图

在这之前先介绍下MDK的数据区域类型:

CODE:代码域,存放在ROM

RO-Data:常量

RW-Data:初始值非零的全局变量

ZI-Data、堆栈空间:初始值为零的全局变量、局部变量、使用malloc动态分配的变量

程序加载阶段,数据存放在只读区域(RO section)、只写区域(RW section)两块区域,由上图可知,数据(Code、RO data和RW data)都存放在这两块区域中,都存放在ROM中

程序运行阶段,在RW section中的数据赋值到SRAM中,另外SRAM中还包括初始化为零的ZI data,RO section的数据仍然保留在ROM中

不同区域存放的数据类型

总结


理解MDK程序的编译、运行过程有助于理解程序运行的本质,是实现程序裁剪的基础,同时对后续Linux的学习也有一定的帮助。

作者

Shi Junduo

发布于

2025-01-06

更新于

2025-01-06

许可协议

评论