• MDK编译器内存分配


    转: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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    关于OPC的研究1]c# opc client源码调试和学习笔记
    分治算法
    递归算法
    Linux 课程笔记 Nginx深入应用实践
    Linux课程笔记 Nginx介绍
    Linux课程笔记 Apache补充
    Linux课程笔记 Apache服务Forbidden 403故障分析
    Linux课程笔记 Apache的优化
    Linux课程笔记 Apache常用模块的介绍
    Linux课程笔记 Apache的介绍与安装
  • 原文地址:https://www.cnblogs.com/leo0621/p/9978469.html
Copyright © 2020-2023  润新知