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

STM32内存五区及堆栈空间大小设置(启动文件浅析)

前言

嘿,朋友们!今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”,要是没整明白,程序说不定就“翻车”了。别担心,我这就带你一步步搞懂这事儿,让你轻松上手,稳稳地写出靠谱的代码!准备好了吗?Let's go!


一. 内存五区的概念

在嵌入式系统中,堆(Heap)和栈(Stack)是两种不同的内存区域,它们在程序运行中扮演着重要的角色。除此之外,还有其他几个关键的内存区域,包括全局区/静态区、常量区和代码区(内存五区

1.1 栈(Stack)

栈是由编译器自动管理的内存区域,用于存储函数调用时的参数、局部变量等。栈的大小在系统启动时确定,如果栈空间过小,可能会导致栈溢出,进而引发程序崩溃,所以选定合适的栈空间是的很有必要的。栈的特点是后进先出(LIFO),即最后进入的元素最先被移除。

#include <stdio.h>//在C语言中,栈内存用于存储函数调用时的局部变量
void StackExample() 
{int localArray[10]; // 在栈上分配一个大小为10的数组int size = 10;// 使用栈上的内存for (int i = 0; i < size; i++) {localArray[i] = i * i; // 栈内存存储平方值}// 打印栈上的内存内容for (int i = 0; i < size; i++) {printf("localArray[%d] = %d\n", i, localArray[i]);}
}

1.2 堆(Heap)

堆用于动态内存分配,由程序员自主通过mallocfree函数管理分配。堆的大小通常是动态的,由剩余的可用内存决定。堆的特点是灵活,可以动态分配和释放内存,但如果不正确管理,可能会导致内存泄漏。

注:用户不能通过malloc指定地址去申请内存,可能会导致内存碎片化或其他问题,能指定申请内存的大小

#include <stdio.h>
#include <stdlib.h>//堆内存通常用于自主动态分配内存
void HeapExample() 
{int *array;// 定义一个指向整数的指针,用于存储动态分配的数组int size = 10; // 需要分配的数组大小// 从堆中分配内存,分配的总字节数为40字节,array得到的是一个指向分配内存的指针array = (int *)malloc(size * sizeof(int));//检查malloc是否成功分配内存。如果分配失败,malloc会返回NULL。if (array == NULL) {printf("Memory allocation failed!\n");return;}// 使用分配的内存for (int i = 0; i < size; i++) {array[i] = i * i; // 示例:存储平方值}// 打印分配的内存内容for (int i = 0; i < size; i++) {printf("array[%d] = %d\n", i, array[i]);}// 释放分配的内存free(array);printf("Memory freed.\n");
}

1.3 全局区/静态区

全局区/静态区用于存储全局变量和静态变量。它分为两个部分:

  • .bss段用于存储未初始化或初始化为0的全局变量和静态变量。它不占用可执行文件的空间。

  • .data段用于存储经过初始化且初始化值非0的全局变量和静态变量。

#include <stdio.h>// 全局变量
int globalVar = 42;void StaticExample() 
{// 静态变量static int staticVar = 0;// 每次调用函数时,静态变量的值会保留,不会像局部变量一样消失staticVar++;printf("Global Variable: %d\n", globalVar);printf("Static Variable: %d\n", staticVar);
}

1.4 常量区

常量区用于存储字符串常量和其他不可修改的数据。这些数据在程序运行期间是只读的

const char *message = "Hello, World!";

1.5 代码区

代码区用于存储程序的执行代码,包括函数和中断向量表等。

Flash存储器用于存储程序代码和常量数据,而RAM用于存储变量(全局变量、静态变量和局部变量)和堆栈等运行时数据。

存储器类型地址范围用途
Flash存储器0x08000000 - 0x080FFFFF程序代码、中断向量表、常量数据
RAM存储器0x20000000 - 0x2000FFFF全局变量、静态变量、堆栈、堆

二. 设置堆栈大小的方法

在使用STM32编程时,一般情况下我们编写程序很少出现栈溢出所以不会关注堆栈空间的大小,而在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。

在STM32工程中,有两种主要方法可以设置堆栈大小:

方法1:直接在启动文件中修改

启动文件(通常是startup_stm32xxxxx.s)中包含了堆栈大小的设置。可以直接修改这些值来调整堆栈大小:

方法2:可以通过图形界面配置堆栈大小

打开启动文件,点击下方Configuration Wizard,点expand all展开,可在value栏框中设置堆栈空间的大小。

总结

今天的内容就到这里啦!咱们一起把STM32的内存五区和堆栈空间大小设置给“拿下”了。内存五区就像是程序的“小家”,每个区域都有自己的“职责”,把它们安排得明明白白,程序才能跑得顺顺当当。至于堆栈空间大小设置,那更是关键中的关键,要是堆栈给少了,程序一“激动”就容易“爆仓”,要是给多了,又有点浪费。所以,根据自己的需求,合理地在启动文件里调整一下,就能让程序舒舒服服地运行啦。

希望今天的分享对你有帮助哦!要是还有啥疑问,或者想继续唠唠嵌入式开发那些事儿,随时来找我哈。下次见啦,拜拜!

相关文章:

STM32内存五区及堆栈空间大小设置(启动文件浅析)

前言 嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”&#xff0c;要是没整明白&#xff0c;程序说不定就“翻车”了。别担心&#xff0c;我这就带你一步步搞懂这事儿&#xff0c;让你轻松上手&#xff0c…...

微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型

微信小程序的轻量化特性与DeepSeek大模型的AI能力结合&#xff0c;可快速构建智能问答、内容生成等场景化服务。通过火山方舟平台提供的标准化接口&#xff0c;开发者无需深入算法细节即可调用模型能力。 一、注册火山引擎账号&#xff0c;创建API Key和model&#xff08;接入…...

(八)Java-Collection

一、Collection接口 1.特点 Collection实现子类可以存放多个元素&#xff0c;每个元素可以是Object&#xff1b; 有些Collection的实现类&#xff0c;可以存放重复的元素&#xff0c;有些不可以&#xff1b; 有些Collection的实现类&#xff0c;有些是有序的&#xff08;Li…...

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…...

C++ | 哈希表

前言 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 —…...

leetcode_动态规划/递归 70. 爬楼梯

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&#xff1a; 考虑: 假设现在已经爬到了某一阶台阶&#xff0c;那是如何到达这里的呢&#xff1f;可能是从前一阶台阶爬上来的&am…...

基于Rook的Ceph云原生存储部署与实践指南(上)

#作者&#xff1a;任少近 文章目录 1 Ceph环境准备2 rook部署ceph群集2.1 Rook 帮助地址2.2 安装ceph2.3 获取csi镜像2.4 Master参加到osd2.5 设置默认存储 3 Rook部署云原生RBD块存储3.1 部署storageclass资源3.2 部署WordPress使用RBD3.3 WordPress访问 4 Rook部署云原生RGW…...

C++ Qt常见面试题(4):Qt事件过滤器

在 Qt 中,事件过滤器(Event Filter)提供了一种机制,可以拦截并处理对象的事件(如鼠标事件、键盘事件等),在事件到达目标对象之前对其进行预处理。事件过滤器通常用于以下场景: 捕获和处理特定的事件(如鼠标点击、按键等);对事件进行筛选或修改;实现全局的事件监听功…...

regionserver实例僵住问题分析

问题现象: 应用提交超时,发现regionserver实例异常。hbase原生页面这个实例dead,业务连接到这个rs的进程超时8个regionserver实例。 D08在18:30分后显示warning,应用提交任务到这个rs节点超时,hbase控制台不显示d08的rs信息了。19:30在页面停止rs实例失败,然后kill进程…...

服务器离线部署DeepSeek

目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网&#xff0c;因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…...

QT mac系统下qml实现的菜单栏,标准快捷键Delete无作用或失灵的处理

一.在mac系统下,QT官方提供的删除快捷键无作用。 1.下面这一段代码,最后一个menuItem采用的是QT自带的标准快捷键,但是在使用的过程中,快捷键无响应。大家可以将代码带入简单的demo尝试一下: MenuBar {id: rootMenu {id: editMenutitle: TransText.titleBar_EditMenuItem…...

redis序列化设置

redis序列化设置 redis序列化设置序列化对象里有org.joda.time.DateTime1&#xff09;、报错内容如下2&#xff09;、解决方案&#xff1a;分别自定义时间的序列化和反序列化&#xff0c;以对象形式关联到redisTemplate redis序列化设置 redis序列化设置&#xff0c;通过自定义…...

浅谈C++/C命名冲突

前言 在这里我会简要地介绍产生命名冲突的原因&#xff0c;和C中处理命名冲突的方法&#xff0c;同时和C语言的解决办法进行比较。 相信你在阅读完之后一定会有收获。对于我们来说&#xff0c;了解编译器的编译链接过程才能更好的理解编译器是如何报错的&#xff0c;更能让我们…...

【语音编解码】常用的基于神经网络的语音编解码方案对比

引言 随着实时通信与多媒体应用的爆炸式增长&#xff0c;传统语音编解码技术正面临带宽效率与音质保真的双重挑战。近年来&#xff0c;基于深度学习的神经编解码器突破性地将端到端架构、动态码率控制与可解释信号处理相结合&#xff0c;在3kbps以下超低码率场景仍能保持自然语…...

PVE 配置显卡直通

博客地址&#xff1a;PVE 配置显卡直通 配置 Device: Dell PowerEdge T630CPU: Intel Xeon E5-2696 v4 x2GPU 1: Matrox Electronics Systems Ltd. G200eR2GPU 2: NVIDIA GeForce GTX 1060 3GBOS: Proxmox VE bookworm 8.3.1 x86_64 注意事项 硬件需支持并在 BIOS 中开启 I…...

Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来

Kronecker分解&#xff08;K-FAC&#xff09;&#xff1a;让自然梯度在深度学习中飞起来 在深度学习的优化中&#xff0c;自然梯度下降&#xff08;Natural Gradient Descent&#xff09;是一个强大的工具&#xff0c;它利用Fisher信息矩阵&#xff08;FIM&#xff09;调整梯度…...

ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台&#xff0c;提供了丰富且详尽的地表覆盖数据。然而&#xff0c;这些数据通常以栅格格式存在&#xff0c;不利于进行空间分析和数据…...

React + TypeScript 数据模型驱动数据字典生成示例

React TypeScript 数据模型驱动数据字典生成示例 引言&#xff1a;数据字典的工程价值 在现代化全栈开发中&#xff0c;数据字典作为业务实体与数据存储的映射桥梁&#xff0c;直接影响系统可维护性与团队协作效率。传统手动维护字典的方式存在同步成本高和版本管理混乱两大痛…...

道可云人工智能每日资讯|深圳将设立人工智能和机器人产业基金

道可云元宇宙每日简报&#xff08;2025年2月26日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 上海青浦发布国际产业协作元宇宙平台 近日&#xff0c;“2025出海企业与跨境专业服务论坛”在上海青浦区徐泾镇举行。论坛上重磅发布三大全球化服务平台&#xff0c…...

[2024年下半年架构师考试真题之论文]

2024论文真题试题一(架构) 论面向服务的架构设计 Web service 是一种通过互联网协议(如 HTTP)来提供服务的软件系统,它允许不同的应用程序之间进行交互,而无需考虑它们所使用的操作系统、编程语言或硬件平台。其本质是将应用程序的功能以服务的形式暴露出来,使得其他应…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...