STM32的内存(堆和栈)

news/2024/11/12 11:37:18/文章来源:https://www.cnblogs.com/jiatai-blogs/p/18538187

一般来说单片机的内存指的是FLASH和RAM,当在程序中定义了全局变量、局部变量、只读变量等参数时都是会存放到对应的FLASH或者是RAM中。具体对单片机FLASH和RAM的介绍之后再写,这里只对单片机内存分配,对堆和栈以及变量的存储做一个梳理和记录。

1、FLASH(0x0800 0000)

FLASH主要是存放程序代码、全局变量(不为零)及常量的。下面是将 FLASH内部进行细分之后的一张图。

STM32_FLASH

STM32的FLASH是从地址0x0800 0000开始的,是向上增长的。FLASH又可以细分为这么几个部分:

(1)文本段 (Text),其中文本段中又包含可执行代码 (Executable Code)和常量 (Literal Value);例如:const int B=1中的B的地址以及我们自己写的程序代码的地址均储存在FLASH的文本段中;

(2)只读数据区域 (Read Only Data);

(3)数据复制段 (Copy of Data Section),这个段充当的作用是存放程序中初始化为非0值的全局变量的初始值,之所以要将初始值存放到这里,是因为全局变量是存放在RAM上的,RAM上的值掉电便丢失,每次上电后这些变量是要进行重新赋值的,而重新赋的值就存放在这里;

这是一个特别的情况,就是初始值不为零的全局变量,他储存的地址是在FlASH中,但开始运行程序时,这个定义的全局变量就会被拷贝到RAM中,此时若要查询变量的地址,发现是在RAM中;可通过查看ST-LINK Utility查看全局变量的地址。 

2、RAM(0x2000 0000起)

相对与FLASH来说,RAM主要就是用来存储数据了,在RAM中值得关注的是堆和栈的空间,堆是向上增长的而栈是向下生长的,如果一个函数运行的时候有大量的局部变量(栈向下增长),同时程序在整个过程中malloc申请了大量的堆空间而没有释放(堆向上增长),造成堆和栈空间的冲突,一旦堆栈冲突,系统就崩溃了。

如下是STM32中RAM的分区:

STM_RAM

RAM中包含了如下几个部分:

(1)data:存放初始化为非0值的全局变量;

(2)bss:存放未初始化或者是初始化为0的全局变量;

(3)堆(Heap) : 由malloc申请,由free释放;堆是程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。可以根据需要请求一段连续的内存空间,并在程序执行过程中随着数据的变化而增长或减小。

(4)栈(Stack) : 存放局部变量、函数调用时的返回地址以及中断入口等;函数执行结束时这些存储单元自动被释放,其大小主要看函数调用的深度。

这是一个特殊的内存区域,主要用于存储程序执行过程中的局部变量、函数参数和函数调用的返回地址。它是按照后进先出的原则工作的,类似于生活中的堆叠物品。

堆和栈的空间可以由我们来自由设定,可在在STM32的启动文件(.s)中,刚开头就有对堆(Head_Size)和栈(Stack_Size)空间的定义描述。堆栈是一种用于存储函数调用和局部变量的内存区域。在STM32中,堆栈通常位于SRAM中的特定区域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830699.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Boost.asio与Boost.beast基于协程连接ws

目录目录 前言 准备工作 实现初始化io_context并监听信号 启动连接ws的线程并启动io_context 建立tcp链接(以下步骤皆位于ws函数中) ws握手 传输数据 效果总结前言 本文主要介绍一个使用Boost.asio和Boost.beast基于协程连接Websocket(ws)的方法。其中C++版本为20,Boost版本…

使用 Let’s Encrypt 免费申请泛域名 SSL 证书,并实现自动续期

使用 Let’s Encrypt 免费申请泛域名 SSL 证书,并实现自动续期 目录使用 Let’s Encrypt 免费申请泛域名 SSL 证书,并实现自动续期🛠️ 环境准备💡 什么是 Let’s Encrypt?🧠 Let’s Encrypt 证书颁发原理1. 域名验证2. 证书生成3. 证书安装4. 自动续期🛠️ Certbot…

Python爬虫学习笔记

目录基础篇:HTTP:HTTP请求:请求行:请求头:请求体:HTTP响应:状态行:响应头:响应体:Requests库:GET请求:POST请求:HTML:HTML网页结构:HTML标签:网页解析:Regular Expression:元字符:量词:正则表达式:Re解析:实战案例:Beautiful Soup:安装:成员属性/函数…

高级语言程序设计第6次作业

高级语言程序设计课程第六次个人作业 这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/2024C/homework/13303 学号:102300303 姓名:梁佳 第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11…

【NX/UG】解决:使用重用库的零件,下次打开发现零件丢失问题

NX12.0: 1、找到文件->实用工具->用户默认设置2、基本环境->重用库->可重用组件->更改组件目录[Windows],将目录更改到当前文件工作目录即可-------------------------------------------------------------------------------------------------------------…

腾讯云云服务器数据迁移实战方案

前言 我在三年前购买的腾讯云服务器今年过期咯, 今年的腾讯云双十一活动也是给力优惠攻略极速观看: 刻不容缓腾讯云双十一活动羊毛攻略!!!-腾讯云开发者社区-腾讯云 极速通道购买: 腾讯云11.11上云拼团Go 经过上面的攻略我购买了一个 2h4g 和 4h8g 的云服务器, 我将 Mysql 、Re…

20222418 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用…

Windows 10 配置为 NTP 时间服务器的操作步骤及解析

之前有过将 Windows 10 配置为 NTP 时间服务器的经历,但是没有做文字记录。 这次又需要做一样的配置,对网上的资料和配置细节不太确定,所以设置完后写了本篇记录。 操作步骤设置服务器类型为 NTP;修改注册表键值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32…

20222302 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 1.1恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用超…

2024-2025-1 20241415 《计算机基础与程序设计》第七周学习总结

2024-2025-1 20241415 《计算机基础与程序设计》第七周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标 数组与链表、基于数组和基于链表实现数据结构、无序表与有序表、…

MAC下使用Clion软件进行STM32的HAL库的开发

1、准备的软件 (1)clion: 链接:https://www.jetbrains.com.cn/clion/ 破解:方法可在某宝上去找。 (2)STM32CubeMX与ST_Link: 链接:https://www.st.com.cn/content/st_com/zh/stm32cubemx.html 破解:免费使用 mac电脑在安装的时候会出现上面的界面,依次安装即可。 (3)macOS…

2024-2025-1 20241314 《计算机基础与程序设计》第七周学习总结

2024-2025-1 20241314 《计算机基础与程序设计》第七周学习总结 作业信息这个作业属于哪个课程 <班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标 数组与链表 基于数组和基于链表实现数据结构…