STM32:堆和栈(Heap Stack)及SRAM存储使用
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存储使用相关推荐
- STM32堆和栈(Heap Stack)及SRAM存储使用
编译一个程序,出现下面的信息: 明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间.让我们打开map文件: 可以看到每个文 ...
- stm32 堆和栈(stm32 Heap Stack)
关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...
- stm32 堆和栈(stm32 Heap Stack)【worldsing笔记】
关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...
- 计算机程序中的堆和栈的区别,内存中的堆与栈(stack)和栈的区别
前言:我们经常听到一个概念,堆和栈.实际上,数据结构中有两个相同的概念,但这与内存堆栈不同.本文还将说明它们之间的区别,此内.函数完成后,这些内容将被自动销毁. .它的特点是效率高,但内存大小有限. ...
- java堆、栈、堆栈,常量池的区别,史上最全总结
先说一下栈和堆栈,我们听老一辈的程序员一般都会说堆栈,其实栈就是堆栈的意思,连着叫只是由于历史的原因.博主04年学数据结构的时候,书上都是说的堆栈,FILO(先进后出),也经常拿堆栈和队列,FIFO( ...
- 堆(heap)与栈(stack)的区别(一)
堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,但它与数据结构中的堆不是一回事,分配方式类似于链表. 栈(stack):由编译器自动分配和释放,存函数的参数值, ...
- 堆(heap)和栈(stack)的区别
1. 申请方式 stack:由系统自动分配.例如,声明在函数中一个局部变量 int b; 系统自动在栈中为 b 开辟空间 heap:需要程序员自己申请,并指明大小,在 c 中 malloc 函数,对于 ...
- 【编程】堆(heap)和栈(stack)的区别
从C/C++的内存分配(与操作系统相关)上来说,堆(heap),栈(stack)属于内存空间的一段区域. 效率: 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持(有专门的寄存器存放栈的地址,压 ...
- 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理
栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第 ...
最新文章
- C 的大致运行原理。
- Tungsten Fabric SDN — SmartNIC vRouter 软件架构设计
- 看别人的C/C++代码时发现自己所不知道的语法~
- [Angularjs]ng-repeat中使用ng-model遇到的问题
- Retrofit 2.0
- 如何选择PDU电源配套机柜?
- 珠海a货翡翠,惠州a货翡翠
- 详细介绍Linux硬盘挂载步骤
- 西门子主程序调用子程序_S7200Smart 子程序局部变量使用教程
- java 课后习题 随机数统计
- python问题分享_零基础入门Python常见问题分享
- Error opening Velodyne socket dump file 的一种可能解决方法
- 华三 h3c 单臂路由配置
- odb 使用指南(二)Hello World
- 怎么查询网络热点事件的舆论热度的办法技巧
- [Qualcomm][MSM8909]APQ8009基线上编写一个OpenGl测试程序
- lighttpd 记录
- nodejs c++ addon插件的应用场景
- 利用python进行探索性数据分析(EDA):以Kaggle泰坦尼克号数据集为例
- crm自动编号(第二天再次001从开始)