MDK程序组成、存储与运行
MDK程序的编译过程
MDK程序从C/C++代码、汇编代码到二进制文件经历一下几个步骤:
经过编译器处理得到了.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的学习也有一定的帮助。
MDK程序组成、存储与运行