当前位置: 首页 > news >正文

嵌入式单片机的存储区域与堆和栈

一、单片机存储区域

如图所示位STM32F103ZET6的参数:
单片机的ROM(内部FLASH):512KB,用来存放程序代码的空间。
单片机的RAM:64KB,一般都被分配为堆、栈、变量等的空间。
在这里插入图片描述

二、堆和栈的概念

单片机中的堆和栈是用来存储程序运行时的数据的两个重要区域。堆和栈都存在于单片机的RAM(随机存储器)中。
堆是用来存储动态分配的内存空间的区域。在单片机中,堆的大小取决于程序的需求,但是总大小不能超过单片机硬件的实际RAM大小。堆的分配和释放是由程序员手动控制的,通常使用malloc()和free()等函数来进行操作。
栈是用来存储函数调用和局部变量的区域。每当一个函数被调用时,函数的参数、返回地址和局部变量等信息都会被压入栈中。当函数执行完毕后,这些信息会被弹出栈。栈的大小是由编译器在编译时确定的,通常是根据函数的嵌套深度和局部变量的大小来决定的。
堆和栈都是用来存储程序运行时的数据的区域,但是它们的分配和使用方式有所不同。

三、堆和栈的位置与分配方式

堆栈位置

在这里插入图片描述
栈:向低地址扩展,从上往下扩展;
堆:向高地址扩展,从下网上扩展;
设置堆栈的空间大小时要根据程序需求合理调整,如果堆或栈的空间分配不足,会导致堆栈溢出,程序跑飞。

合理分配堆栈

可以通过编译后生成的后缀为.htm的文件查看所需的栈的大小:
在这里插入图片描述

如图所示为某程序的.htm文件的内容:
最大的栈空间=800bytes+未知
未知的空间去800的20%就足够了。
那么栈空间的大小可以设置为800+160=960byte

堆的分配和释放是由程序员手动控制的,通常使用malloc()和free()等函数来进行操作。栈空间的大小根据我们在程序中分配的最大的堆的大小来决定。当然,最好也预留一些预留,如果在程序中分配了100byte,那么,可以设置堆大小为110bytes。

四、案例分析

打开KEIL工程中的Map File文件后,在文件内容最下方可以看到如下统计。

在这里插入图片描述
图中,各代号含义如下,
Code:代码存储区。这部分是存放代码的。
RO-Data:只读数据区。这部分保存程序中用 const 定义的全局常量数据和字符串。
RW-Data:已初始化的读写数据。程序中定义的已经初始化的全局变量和静态变量。
ZI-Data:未初始化的读写数据。程序中定义的未初始化的全局变量和静态变量。这部分内容是在程序运行的时候保存在RAM中的。
在这里插入图片描述

五、STM32堆栈设置

在这里插入图片描述

相关文章:

  • 云原生机器学习平台cube-studio开源项目及代码简要介绍
  • 【QT】非常简单的登录界面实现
  • 同城配送小程序解决方案
  • 为什么react call api in cDidMount
  • SQL手工注入漏洞测试(MySQL数据库)
  • 【MySQL】:超详细MySQL完整安装和配置教程
  • 最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)
  • C#与php自定义数据流传输
  • 免费的ChatGPT分享
  • axios进行图片上传组件封装
  • Android笔记(二十一):Room组件实现Android应用的持久化处理
  • 【网络安全 | 网络协议】结合Wireshark讲解TCP三次握手
  • ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料
  • 蓝牙物联网与嵌入式开发如何结合?
  • 人工智能:网络犯罪分子的驱动力
  • Unity网格篇Mesh(一)
  • Python五子棋程序实现详解
  • Android studio 使用greenDao根据实体类生成dao类
  • 【我与java的成长记】之面向对象的初步认识
  • 手写爬虫框架
  • 大巴车高速上撞山致2死2伤,广东肇庆警方通报
  • 铜川耀州窑遗址内违法矿场存在多年,省市区文物部门多次处罚叫停仍在生产
  • 肖钢:一季度证券业金融科技投资强度在金融各子行业中居首
  • 以开放促发展,以发展促开放,浙江加快建设高能级开放强省
  • 多图|多款先进预警机亮相雷达展,专家:中国预警机已达世界先进水平
  • 有关“普泽会”,俄官方表示:有可能