STM32堆和栈(Heap & Stack)及SRAM存储使用

编译一个程序,出现下面的信息:

明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间。让我们打开map文件:

可以看到每个文件所使用的SRAM大小,比如delay文件使用了4个字节,地址从0x20000014到0x20000017。其中可以看到HEAP和STACK占了大头,分别占了0x00000200和0x00000400的空间。STACK的起始地址是0x20000360,大小是0x00000400,那么最后的地址是0x20000760,刚好等于1888=0x760字节。于是我们就知道SRAM空间用来存放了什么东西了:1、各个文件中声明和定义的全局变量、静态数据和常量;2、HEAP区;3、STACK区。

堆区(heap):一般由程序员使用malloc或new来进行分配,在适当的时候用free或delete来进行释放。若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。

栈区(stack):由编译器自动分配和释放,程序员不做干涉。存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。程序的中断,函数的形式参数传递等都需要STACK来实现。

注意:

1、堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了,不然就会发生hardfault错误。

2、所有在处理的函数,包括函数嵌套,递归,等等,都是从这个“栈”里面,来分配的。所以,如果栈大小为2K,一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault….这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!

3、  STM32的栈,是向下生长的。事实上,一般CPU的栈增长方向,都是向下的。而堆的生长方向,都是向上的。堆和栈,只是他们各自的起始地址和增长方向不同,他们没有一个固定的界限,所以一旦堆栈冲突,系统就到了崩溃的时候了。

4、程序中的常量,如果没加const也会编译到SRAM里,加了const会被编译到flash中。

附上SRAM中的数据存放情况图:

STM32:堆和栈(Heap Stack)及SRAM存储使用相关推荐

  1. STM32堆和栈(Heap Stack)及SRAM存储使用

    编译一个程序,出现下面的信息: 明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间.让我们打开map文件: 可以看到每个文 ...

  2. stm32 堆和栈(stm32 Heap Stack)

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...

  3. stm32 堆和栈(stm32 Heap Stack)【worldsing笔记】

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...

  4. 计算机程序中的堆和栈的区别,内存中的堆与栈(stack)和栈的区别

    前言:我们经常听到一个概念,堆和栈.实际上,数据结构中有两个相同的概念,但这与内存堆栈不同.本文还将说明它们之间的区别,此内.函数完成后,这些内容将被自动销毁. .它的特点是效率高,但内存大小有限. ...

  5. java堆、栈、堆栈,常量池的区别,史上最全总结

    先说一下栈和堆栈,我们听老一辈的程序员一般都会说堆栈,其实栈就是堆栈的意思,连着叫只是由于历史的原因.博主04年学数据结构的时候,书上都是说的堆栈,FILO(先进后出),也经常拿堆栈和队列,FIFO( ...

  6. 堆(heap)与栈(stack)的区别(一)

    堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,但它与数据结构中的堆不是一回事,分配方式类似于链表. 栈(stack):由编译器自动分配和释放,存函数的参数值, ...

  7. 堆(heap)和栈(stack)的区别

    1. 申请方式 stack:由系统自动分配.例如,声明在函数中一个局部变量 int b; 系统自动在栈中为 b 开辟空间 heap:需要程序员自己申请,并指明大小,在 c 中 malloc 函数,对于 ...

  8. 【编程】堆(heap)和栈(stack)的区别

    从C/C++的内存分配(与操作系统相关)上来说,堆(heap),栈(stack)属于内存空间的一段区域. 效率: 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持(有专门的寄存器存放栈的地址,压 ...

  9. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

    栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第 ...

最新文章

  1. C 的大致运行原理。
  2. Tungsten Fabric SDN — SmartNIC vRouter 软件架构设计
  3. 看别人的C/C++代码时发现自己所不知道的语法~
  4. [Angularjs]ng-repeat中使用ng-model遇到的问题
  5. Retrofit 2.0
  6. 如何选择PDU电源配套机柜?
  7. 珠海a货翡翠,惠州a货翡翠
  8. 详细介绍Linux硬盘挂载步骤
  9. 西门子主程序调用子程序_S7200Smart 子程序局部变量使用教程
  10. java 课后习题 随机数统计
  11. python问题分享_零基础入门Python常见问题分享
  12. Error opening Velodyne socket dump file 的一种可能解决方法
  13. 华三 h3c 单臂路由配置
  14. odb 使用指南(二)Hello World
  15. 怎么查询网络热点事件的舆论热度的办法技巧
  16. [Qualcomm][MSM8909]APQ8009基线上编写一个OpenGl测试程序
  17. lighttpd 记录
  18. nodejs c++ addon插件的应用场景
  19. 利用python进行探索性数据分析(EDA):以Kaggle泰坦尼克号数据集为例
  20. crm自动编号(第二天再次001从开始)

热门文章

  1. 为什么哈希表的容量一定要是 2的整数次幂?
  2. easyUI之ComboBox(下拉列表框)
  3. 查询服务器硬件配置的命令
  4. Emacs 中英文字体设置
  5. Avalon and Indigo CTP- March 2005提供公开下载!
  6. mysql迁移数据目录,这个坑你遇到过吗?
  7. 什么是「数独」,简单介绍
  8. composer 下载包慢的解决方法
  9. 阿里云虚拟主机安装wordpress,提示连接数据库失败的解决方法
  10. VS 2005部署应用程序提示“应用程序无法正常启动( 0x0150002)” 解决方案