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)
堆用于动态内存分配,由程序员自主通过malloc
和free
函数管理分配。堆的大小通常是动态的,由剩余的可用内存决定。堆的特点是灵活,可以动态分配和释放内存,但如果不正确管理,可能会导致内存泄漏。
注:用户不能通过
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内存五区及堆栈空间大小设置(启动文件浅析)
前言 嘿,朋友们!今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”,要是没整明白,程序说不定就“翻车”了。别担心,我这就带你一步步搞懂这事儿,让你轻松上手,…...
LVS+Keepalived高可用群集配置案例
以下是一个 LVSKeepalived 高可用群集配置案例: 1、环境准备 LVS 主调度器(lvs1):IP 地址为 192.168.8.101,心跳 IP 为 192.168.4.101LVS 备调度器(lvs2):IP 地址为 192.168.8.102…...
MySQL 中如何解决深度分页的问题? MySQL中 join、inner join、left join、right join区别
MySQL 中如何解决深度分页的问题? 在 MySQL 中解决深度分页问题的核心思路是减少扫描的数据量,尤其是避免通过 LIMIT offset, size 导致的大范围数据扫描。以下是三种优化方法及其原理、适用场景和注意事项: 1. 子查询 覆盖索引(…...
本地部署DeepSeek-R1(Ollama+Docker+OpenWebUI知识库)
安装Ollama 打开 Ollama官网 https://ollama.com/下载安装 Ollama服务默认只允许本机访问,修改允许其它主机访问 OLLAMA_HOST0.0.0.0 ollama serve也可以添加系统环境变量 都知道模型体积很大,顺便也通过环境变量修改模型存放位置,我这…...
ubuntu22.04安装docker engine
在Ubuntu 22.04上安装Docker Engine可以通过以下步骤完成: 更新系统包索引: sudo apt update安装必要的依赖包: 这些包允许apt通过HTTPS使用仓库。 sudo apt install -y apt-transport-https ca-certificates curl software-properties-commo…...
Protobuf原理与序列化
本文目录 1. Protobuf介绍2. Protobuf的优势3. 编写Protobuf头部全局定义消息结构具体定义字段类型定义标签号Base128编码 4. TLVProtobuf的TLV编码如何通过Varint表示300? 5. 编译Protobuf6. 构造消息对象 前言:之前写项目的时候只是简单用了下Protobuf…...
Redis|事务
文章目录 是什么能干嘛Redis 事务 VS 数据库事务怎么玩小总结 是什么 首先回想一下什么是数据库的事务?数据库事务是指作为单个逻辑单元执行的一系列操作,具备以下四个关键特性(ACID): 原子性(Atomicity&am…...
树莓百度百科更新!宜宾园区业务再添新篇
树莓集团宜宾园区业务不断拓展,主要体现在以下几个方面: 产业布局 -聚焦数字经济核心领域:涵盖软件开发、人工智能、大数据等,吸引众多上下游企业入驻,形成从芯片研发、软件开发到系统集成的完整产业链条。 -推进“双…...
设计模式教程:模板方法模式(Template Method Pattern)
一、概述 模板方法模式(Template Method Pattern) 是一种行为型设计模式,旨在定义一个操作中的算法骨架,而将一些步骤的具体实现延迟到子类中。通过模板方法模式,父类可以不改变算法结构的情况下,让子类重…...
unity学习54:图片+精灵+遮罩mask,旧版文本 text 和新的TMP文本
目录 1 图片 image 1.1 如果直接导入image 1.2 图片 image 和精灵 sprite 1.2.1 继续修改上面的格式 texture type 是default 1.2.2 再次关联到UI的 image 物体上就可以了 1.3 图片和遮罩 mask 1.3.1 创建1个父物体和1个子物体,分别都是image 1.3.2 如果父…...
【Java项目】基于Spring Boot的校园闲置物品交易网站
【Java项目】基于Spring Boot的校园闲置物品交易网站 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:校园闲置物品交易网站是一个典型的管理系统,主要功能包括管理员:首页、个人中心、用户管理、商品类…...
网页制作08-html,css,javascript初认识のhtml使用框架结构,请先建立站点!
框架一般由框架集和框架组成。 框架集就像一个大的容器,包括所有的框架,是框架的集合。 框架是框架集中一个独立的区域用于显示一个独立的网页文档。 框架集是文件html,它定义一组框架的布局和属性,包括框架的数目,框架…...
DeepSeek-R1:通过强化学习激励大语言模型的推理能力
摘要 本文介绍了我们的第一代推理模型,DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是通过大规 模强化学习(RL)训练的模型,在没有使用监督微调(SFT)这个前置步骤的情况下,展示了卓越的推…...
hbase笔记总结1
hbase是nosql的一种,非关系型数据库,not only sql,可处理大规模、高并发的数据,是web2.0以后的产物hbase的扩展性和灵活性更好,而且筛选能力相较于MySQL更优nosql的四大特点: 灵活的数据模型 (1…...
关于C++中static_cast、const_cast、dynamic_cast的简单介绍
在C中,static_cast、const_cast 和 dynamic_cast 是用于类型转换的关键字,它们的行为和适用场景有显著区别。以下是它们的核心差异和用法总结: 1. static_cast 用途 用于明确且安全的类型转换,通常用于编译时已知类型关系的场景…...
计算机毕业设计 ——jspssm513Springboot 的小区物业管理系统
作者:程序媛9688 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题)…...
详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)
目录 步骤一:首先确认自己是否已经安装JDK步骤二:下载安装Tomcat步骤三:Tomcat配置环境变量步骤四:验证Tomcat配置是否成功步骤五:为IDEA配置Tomcat 步骤一:首先确认自己是否已经安装JDK jdk各版本通用安…...
端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port
文章目录 需求:A机器是内网机器,B机器是公网服务器,想要从公网,访问A机器的端口方式:端口映射,内网穿透,使用ssh打洞端口:遇到问题:命令执行成功,但是端口转发…...
2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析
文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需要从中挑出一些…...
win11编译pytorch cuda128版本流程
Geforce 50xx系显卡最低支持cuda128,torch cu128 release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022,工作负荷选择【使用c的桌面开发】,安装完成后将…...
AI人工智能机器学习之降维和数据压缩
1、概要 本篇学习AI人工智能机器学习之降维和数据压缩,以主成分分析(PCA, Principal Component Analysis)为例,从代码层面讲述机器学习中的降维和数据压缩。 2、降维和数据压缩 - 简介 在机器学习和数据分析中,降维&…...
EasyExcel 使用指南:基础操作与常见问题
文章目录 1. EasyExcel 简介2. 基础操作2.1. 写入 Excel 🔥2.2. 读取 Excel ✅2.3. 使用模板 🎨 3. 常见问题与解决方案3.1. 处理日期格式 📅3.2. 数据写入失败:占位符无法匹配 ❌3.3. 内存溢出:大数据量处理 ⚡3.4. 空…...
本地搭建Koodo Reader书库结合内网穿透打造属于自己的移动图书馆
文章目录 前言1. Koodo Reader 功能特点1.1 开源免费1.2 支持众多格式1.3 多平台兼容1.4 多端数据备份同步1.5 多功能阅读体验1.6 界面简洁直观 2. Koodo Reader安装流程2.1 安装Git2.2 安装Node.js2.3 下载koodo reader 3. 安装Cpolar内网穿透3.1 配置公网地址3.2 配置固定公网…...
Mybatis是如何进行分页的?与Mybatis-plus的区别在哪里?
MyBatis 的分页方式及其与 MyBatis-Plus 的区别可以总结如下: MyBatis 的分页实现 逻辑分页(内存分页) 使用 RowBounds 对象,在查询时传入参数,MyBatis 会在结果集返回后,在内存中手动截取指定范围的数据。…...
MySQL 主从同步配置及操作步骤
主从同步是一种常见的数据复制技术,它通过将主库的数据同步到一个或多个从数据库中来保证数据的一致性。从库通过读取主库的 binlog 文件来获取更新并进行同步。 主从复制的方式有三种: 异步复制:不需要从库确认,主库提交数据后…...
【软考-架构】备战2025软考
新老教材对比 科目1(信息系统综合)考点详解 科目2(系统架构设计案例)考点详解 科目3(系统架构设计论文)考点详解 趋于越来越具体 学习方法推荐 第一阶段 – 基础知识阶段 建议一个半月; 先过…...
基于Spark的电商供应链系统的设计与实现
目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 (一)分布式计算系统Spark (二)数据仓库Hive (三)读取服务器本地磁盘的日志数据Flume (四)分布式消息队列Kafka …...
DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能
2025 年 2 月 21 日至 23 日,上海徐汇西岸,2025 全球开发者先锋大会以 “模塑全球,无限可能” 的主题,围绕云计算、机器人、元宇宙等多元领域,探讨前沿技术创新、应用场景拓展和产业生态赋能,各类专业论坛、…...
基于coze+微信小程序实现图片上传并利用大模型解析
项目截图: 实现代码(直接搬去可用) 前提:需要填写你的oss配置coze的api授权配置!!! <template><view class"container"><!-- 高斯模糊背景 --><view class&qu…...
CSS 对齐:深入理解与技巧实践
CSS 对齐:深入理解与技巧实践 引言 在网页设计中,元素的对齐是至关重要的。一个页面中元素的对齐方式直接影响到页面的美观度和用户体验。CSS 提供了丰富的对齐属性,使得开发者可以轻松实现各种对齐效果。本文将深入探讨 CSS 对齐的原理、方法和技巧,帮助开发者更好地掌握…...
Dify部署
Dify部署 安装docker 要在CentOS 7上部署Docker社区版,您可以按照以下步骤进行操作: 卸载旧版本的Docker(如果有): yum remove docker docker-client docker-client-latest docker-common docker-latest docker-l…...
MyBatis-Plus 对比传统 MyBatis 的优势
在现代的 Java 开发中,MyBatis 和 MyBatis-Plus 都是流行的持久层框架。MyBatis 是一个轻量级的 ORM 框架,帮助开发者通过映射文件或注解方式来执行 SQL 操作。MyBatis-Plus 是在 MyBatis 基础上进行的增强,提供了许多简化和优化功能…...
被AWS反撸了,试一下能否申请退还
经过来回几轮沟通,已扣的42美金将退回31美金,未扣的16美金将免除扣款。 31美金的具体计算方法我不知道,对方的回复如下(是了,AWS的客服是用中文回复的): 我理解此结果可能不完全符合您所期望的…...
基于Spring Boot的产业园区智慧公寓管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
MySQL 事务笔记
MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务(Transaction)是数据库操作的逻辑单元,由一组不可分割的SQL操作组成。主要用于保证: 多个操作的原子性(要么全部成功…...
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
很多时候,我们项目在开发环境和生产环境的配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境,我们要用生产数据库,这时候,我们可以利用 p…...
# C# 中堆(Heap)与栈(Stack)的区别
在 C# 中,堆和栈是两种不同的内存分配机制,它们在存储位置、生命周期、性能和用途上存在显著差异。理解堆和栈的区别对于优化代码性能和内存管理至关重要。 1. 栈(Stack) 1.1 定义 栈是一种后进先出(LIFO࿰…...
IP---网络类型
这只是IP的其中一块内容-网络类型,IP还有更多内容可以查看IP专栏,前一章内容为访问服务器流程,可通过以下路径查看IP----访问服务器流程-CSDN博客,欢迎指正 2.网络类型 网络类型---根据二层(数据链路层)所…...
jQuery UI API 文档
jQuery UI API 文档 引言 jQuery UI 是一个基于 jQuery 的用户界面库,它提供了丰富的交互式组件和效果,使得网页开发变得更加简单和高效。本文档旨在为开发者提供全面的 jQuery UI API 信息,帮助您更好地理解和应用 jQuery UI。 jQuery UI 简介 什么是 jQuery UI? jQu…...
rust 前端npm依赖工具rsup升级日志
rsup是使用 rust 编写的一个前端 npm 依赖包管理工具,可以获取到项目中依赖包的最新版本信息,并通过 web 服务的形式提供查看、升级操作等一一系列操作。 在前一篇文章中,记录初始的功能设计,自己的想法实现过程。在自己的使用过…...
J-LangChain,用Java实现LangChain编排!轻松加载PDF、切分文档、向量化存储,再到智能问答
Java如何玩转大模型编排、RAG、Agent??? 在自然语言处理(NLP)的浪潮中,LangChain作为一种强大的模型编排框架,已经在Python社区中广受欢迎。然而,对于Java开发者来说,能…...
文档识别-C#中英文文档识别接口-PDF文件内容识别API
文档识别接口可满足用户在数字化转型过程中对文档处理的高效、准确需求。翔云文档识别接口以成熟的文字识别技术、自然语言处理技术、图像识别技术为核心,能够将文档上的非可编辑文本转化为可编辑的数据,从而提升信息处理的速度与实现文档数字化管理的准…...
什么是元数据管理?为什么数据治理的第一步是整理元数据?
什么是元数据管理? 以下是关于元数据管理、数据治理从元数据开始的原因以及数据治理逻辑的简单介绍: 元数据管理 元数据是关于数据的数据,它主要描述了数据的定义、来源、关系、质量、用途等信息。比如在一个学生成绩管理系统中ÿ…...
QSplashScreen --软件启动前的交互
目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显…...
react使用react-quill 富文本插件、加入handlers富文本不显示解决办法
可以调整图片大小 quill-image-resize-module-react 加入插件quill-image-resize-module-reactQuill.register("modules/imageResize", ImageResize); // 注册图片缩放富文本配置中加入如下const quildConfig {toolbar: {container: [["bold", "ital…...
基于vue框架的的银生中学图书管理系统c7b4q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,书籍分类,书籍信息,书籍借阅,书籍归还 开题报告内容 基于Vue框架的的银生中学图书管理系统开题报告 一、项目背景与意义 随着信息技术的飞速发展和教育现代化进程的加快,学校图书管理面临着前所未有的挑战与机遇。银…...
2025年02月27日Github流行趋势
项目名称:aibrix 项目地址url:https://github.com/vllm-project/aibrix 项目语言:Jupyter Notebook 历史star数:2568 今日star数:554 项目维护者:Jeffwan, varungup90, brosoul, nwangfw, kr11 项目简介&am…...
去耦电容的作用详解
在霍尔元件的实际应用过程中,经常会用到去耦电容。去耦电容是电路中装设在元件的电源端的电容,其作用详解如下: 一、基本概念 去耦电容,也称退耦电容,是把输出信号的干扰作为滤除对象。它通常安装在集成电路…...
Vue.js响应式基础
响应式基础 API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态 ref() 在组合式 API 中,推荐使用 ref() 函数来声明…...
解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案
文章目录 前言操作步骤步骤1:注册账号步骤2:在线体验步骤3:获取API密钥步骤4:安装chatbox步骤5:chatbox设置 价格方面 前言 最近在使用DeepSeek时,开启深度思考功能后,频繁遇到“服务器繁忙&am…...