MDK编译器内存分配

时间:2023-03-08 22:08:21

转:https://blog.****.net/zuixin369/article/details/76195186?locationNum=7&fps=1

Keil MDK编译器完成编译链接后,在调试窗口会出现Code,RO,RW,ZI 四种内存分配区域,下面说明其中的意思。

Code区:代码区。该区域除了存放指令外,还有全局、静态及局部变量的初始化值。当函数被调用时,该函数用code区内局部变量初始化值来初始化堆栈区内分配的局部变量。

RO区:常量区。该区域存放那种类型的数据呢?有字符串常量如int*p="abcd";"abcd"就存储在常量区, 指针p是指向常量区的指针变量。在MDK中,const修饰的数组全局变量放在这个区域里面,该区域数据是绝对不可变的 ,指向只读变量的指针能够访问该区域,但是不能改变该区域数据。

RW区:已初始化成非0值得全局和静态变量。

ZI区:未被初始化或初始化为0的全局和静态变量。大家要注意一点,程序运行时,全局和静态变量存放在RAM里面的静态变量区,该区域初始化一定要用常量。

编译后,FLASH内容包括:Code区+RO区+RW区;

     RAM包括:RW区+ZI区。

  需要注意的是,MDK编译器优化代码,检查语法。在程序中,能够被调用的函数,函数内全局变量被使用了才加到RW区或ZI区,也就是说定义了没使用,使用在函数中,但该函数没有被调用都不会被放在RW区或ZI区内。

运行后,FLASH内的指令至少要完成如下功能:

1.将RW区数据从ROM中搬到RAM静态变量区中,因为RW是变量,变量不能存在ROM中;

2.将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中;

3.开辟启动文件规定大小的堆栈区;

4.当某个函数被调用后,Code区内的初始化值将复制到堆栈的相应地址中。
---------------------
作者:zuixin369
来源:****
原文:https://blog.****.net/zuixin369/article/details/76195186
版权声明:本文为博主原创文章,转载请附上博文链接!