转: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编译器内存分配的更多相关文章

  1. C语言内存分配方法。

    当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...

  2. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  3. java中内存分配策略及堆和栈的比较

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  4. C语言内存分配

      (1)代码区(text segment).存放CPU执行的机器指令(machine instructions).通常,代码区是可共享的 (即另外的执行程序可以调用它),因为对于频繁被执行的程序,只 ...

  5. jvm的内存分配总结

    最近看了周志明版本的<深入理解Java虚拟机>第一版和第二版,写的很好,收获很多,此处总结一下.   jvm中内存划分:   如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 ...

  6. C/C++内存分配

    一.      预备知识—程序的内存分配: 一个由C/C++编译的程序占用的内存分为以下几个部分:1.栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...

  7. C和指针 第十一章 动态内存分配

    声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...

  8. iOS程序中的内存分配 栈区堆区全局区

    在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...

  9. c++中函数中变量内存分配以及返回指针、引用类型的思考

    众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量.指针.引用等等). 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函 ...

随机推荐

  1. Android通过Chrome Inspect调试WebView的H5 App出现空白页面的解决方法(不需要FQ)

    本文系博主原创,未经许可不得转载.如未经本人同意,私自转载或盗取资源提供下载,本人保留追究其法律责任的权利. 调试基于WebView的Hybrid App最舒服的工具当然是Chrome自带的开发者工具 ...

  2. Django 2.0 URL新版配置介绍

    实例 先看一个例子: from django.urls import path from . import views urlpatterns = [ path('articles/2003/', v ...

  3. mssql sql语句过滤百分号的方法分享

    转自:http://www.maomao365.com/?p=6743 摘要: 下文讲述sql脚本中过滤百分号的方法: 实验环境:sql server 2008 R2  百分号:在sql脚本编写中“百 ...

  4. SQLServer2016 AlwaysOn AG基于工作组的搭建笔记

    最近搭建了一套SQLServer2016 AlwaysOn AG. (后记:经实际测试,使用SQLServer2012 也同样可以在Winserver2016上搭建基于工作组的AlwaysOn AG, ...

  5. [C#]List的Sort()、Find()、FindAll()、Exist()的使用方法举例

    [C#基础]List的Sort().Find().FindAll().Exist()的使用方法举例 List函数用得还是比较多的,正好用到其中的向个方法,做了一个例程,再总结一下: 先建一个学生类: ...

  6. 两层c:forEach循环嵌套

    jsp中两级菜单如何用c:forEach输出 items 要被循环的信息 否 无 begin 开始的元素(0=第一个元素,1=第二个元素) 否 0 end 最后一个元素(0=第一个元素,1=第二个元素 ...

  7. Win10家庭版-添加[组策略]

    win10家庭版有很多功能都不能用,这一次就碰到了一个找不到‘组策略’的问题,在网上搜索到了一个方法,记录一下: 新建一个txt,将下面内容复制到文本中: =====分隔符====== @echo o ...

  8. wamp 中安装cakephp Fatal error: You must enable the intl extension to use CakePHP. in XXX

    今天在wamp下安装cakephp3.x的时候,报出这么一条错误:Fatal error: You must enable the intl extension to use CakePHP. in ...

  9. Docker+Nextcloud快速部署个人网盘

    各位大佬好,,,萌新顾北清又回来更新了,今天要快速部署一个人网盘. 有多快呢,,,5分钟吧,因为我们使用Docker部署. Docker基础可以看看我之前的博文.(点这里点这里) 那么,,,开始吧. ...

  10. June 11. 2018 Week 24th, Monday

    Love is the beauty of the soul. 爱是灵魂之美. From Saint Augustine. The complete version of this quote goe ...