码迷,mamicode.com
首页 > 其他好文 > 详细

MDK编译器内存分配

时间:2018-11-18 17:28:57      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:窗口   注意   abc   字符串   除了   oca   全局变量   detail   原创文章   

转:https://blog.csdn.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
来源:CSDN
原文:https://blog.csdn.net/zuixin369/article/details/76195186
版权声明:本文为博主原创文章,转载请附上博文链接!

MDK编译器内存分配

标签:窗口   注意   abc   字符串   除了   oca   全局变量   detail   原创文章   

原文地址:https://www.cnblogs.com/leo0621/p/9978469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!