由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

STM32的地址空间映射图

我们可以看到代码存储区域在CODE区域;

STM32的堆栈是存放在片上静态SRAM中的,地址分配可以见Keil的编译map文件:

代码来源地址:https://download.csdn.net/download/emoeror_zhang/11286638

HEAP                                     0x20000148   Section      512  startup_stm32f10x_hd.o(HEAP)

STACK                                    0x20000348   Section     1024  startup_stm32f10x_hd.o(STACK)

__initial_sp                             0x20000748   Data           0  startup_stm32f10x_hd.o(STACK)

上面节选中, HEAP是堆的基地址,__initial_sp  是栈指针 。示意图如下

三、堆栈地址的设置

在上述图和map中,我么可以看到堆的大小是0线0x200,也就是在0x20000148-0x20000348之间,而栈的地址大小是0x400,也就是在0x20000348-0x20000748。为什么他们的大小是这样的,是怎么由来的呢?

打开汇编文件startup_stm32f10x_hd.s,我们可以找到相对应的设置堆栈大小的程序,如图:

堆和栈,一般堆是由低地址往上增长,栈是由往下减少。都是连续的,C语言不提供内存保护机制类似的功能,如果堆一直增长,栈一直申请,然后就会导致栈溢出,从而导致程序崩溃。

四、变量储存位置分析

同样的,我们还是以上述的map文件为例子进行分析。

如图所示,fac_ms和fac_us 在程序中是static变量类型,储存在0x20000000-0x20000148之间的位置,fac_ms在0x20000016,fac_us在0x20000014,那其他的地址处是什么数据呢?

继续在map里面寻找,找到如下图所示:

发现其余的地质处储存了全局变量数组,以及引用的库文件的全局变量。

在map里面我们看到,全局变量和静态变量储存的位置,和堆栈无关,那么堆栈储存的内容是什么呢?

五、堆栈存放内容

1、栈区

存放函数的参数值,局部变量的值等等临时变量,退出该作用域该临时变量就会自动释放。

2、堆区

系统会给每个程序分配一部分栈空间让他们能够运行起来,问题就是栈空间必然存在不够用的问题,而堆不属于程序,堆是独立的,是公用的。只要你malloc(sizeof(SIZE_YOU_WANT)),就可以得到相应一部分的堆空间。

简单的来说,就是当你使用的时候malloc申请一部分空间来使用,但是别忘记了使用完成之后free掉,不然往往会堆溢出,占用了栈的位置空间,导致程序奔溃。

总结:

如果我们设置了堆的空间大小,但是我们程序中没有进行malloc申请,那么在程序事假运行的时候,我们栈的空间超过本身设置的空间,进入到堆里面,那么程序是不会出错的,但是超过了堆的空间了,进入到全局变量区域,就会出现莫名其妙的错误。

不使用malloc,我们可以将堆设置成0,这是没有问题的,但是栈的空间大小要设置成合适的,不然就会因为栈溢出,进入harderror,程序奔溃。

c语言stm8变量存储类型,STM32存储资源分配解析相关推荐

  1. c语言形参的隐含存储类型,C存储类型

    存储方式 变量的作用域(空间)可分为全局变量和局部变量,变量的存储方式可分为动态存储方式和静态存储方式. 从变量值存在的时间(生存期)来观察,有的变量在程序运行的整个过程都是存在的,有的变量则是在调用 ...

  2. 对象存储2:数据存储类型-文件存储、块存储、对象存储详解

    上一篇介绍了传统存储的几个常用类型,本篇主要介绍云平台用到的常用存储类型,分别是文件存储.块存储和对象存储. 这种分类是以数据存储的方式来命名的,体现了不同的数据存储格式.文件存储会以文件和文件夹的层 ...

  3. 对象存储 OSS > 开发指南 > 存储类型 > 存储类型介绍

    存储类型介绍 更新时间:2020-09-18 14:56:19 编辑我的收藏 本页目录 标准存储(Standard) 低频访问(Infrequent Access) 归档存储(Archive) 冷归档 ...

  4. c语言stm8变量存储类型,STM8使用----STVD(COSMIC)定义变量指定其类型和位定义

    STM8使用----STVD(COSMIC)定义变量指定其类型和位定义 http://www.51hei.com/bbs/dpj-31009-1.html (出处: 单片机论坛) stm8 stvd下 ...

  5. C语言变量的类型和存储位置

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  6. c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍

    描述 C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动 ...

  7. [hadoop3.x]HDFS存储类型和存储策略(五)概述

    文章目录 前言 历史文章

  8. 详细设计 存储分配_零基础学C语言(7):存储类型

    前四节,我们从编写一个计算器的角度,讨论出编程语言需要数据类型.变量和常量,并详细介绍了这三个概念.那么编写一个计算器还需要哪些东西呢? 我们想想看,当我们想设计一个比较复杂的程序,例如开发一款游戏时 ...

  9. SAP EWM - 存储类型 - 入库控制

    1.     确认入库标识:该标识控制上架到该存储类型的WT是否需要确认.如果源存储类型的下架不需要确认和目标存储类型的上架不需要确认,则创建了仓库任务后直接更新库存. 2.     HU类型检查标识 ...

最新文章

  1. SpringBoot自动配置【源码分析】-初始加载自动配置类
  2. DHCP的4步租约过程
  3. 手机玩html5游戏很卡,手机游戏卡怎么办_手机玩游戏卡顿解决办法-系统城
  4. 解决RStudio(非conda安装)在使用Anaconda中的R环境时,缺失“ libbz2-1.dll ”而不能正常启动问题
  5. 推荐一个CSLab------英真时代(非广告,真心的)
  6. 【转】Java 杂谈(三)
  7. 使用lombok时可以自定义get、set方法
  8. MOSFET、IGBT的结构与工作原理详解
  9. 软件工程 第五章:交互图
  10. 浙江杭州1040阳光工程叫家里人来投资违不违法?能不能赚到钱?
  11. 一个P9告诉你为什么某电商怕了拼多多
  12. android 4.4 surfaceflinger 渲染,Android4.4.3--surfaceflinger导致系统起不来,ldb显示问题...
  13. 微信开发者平台应用创建
  14. [简化] [排除] [推理]
  15. Error. Flash Download failed - Target DLL has been cancelled
  16. 表单ajax提交插件,详解javascript表单的Ajax提交插件的使用
  17. iview card布局
  18. 计算机网络另一方找不到,网络共享找不到对方电脑怎么办
  19. c语言解决循环左移和循环右移
  20. 升级 | ONES Wiki 多人实时协作,万物皆可编辑

热门文章

  1. html frame 菜单切换,官方底部导航如何通过frame0.html的JS控制切换
  2. 图像篡改检测pytorch版本
  3. vlayout 1.2.20 发布,阿里 LayoutManager 定制化布局
  4. java B2B2C电子商务平台分析之十一------配置中心和消息总线
  5. 快应用quickapp快速入门教程 by五个半柠檬2
  6. 老版本select2设置初始值
  7. 好插件让你事半功倍!【资源篇】
  8. android79 Fragment生命周期
  9. 巧用FTP命令进行文件传输
  10. XP局域网访问无权限、不能互相访问问题的完整解决方案