单片机栈和堆、FALSH、区别
1. Flash(闪存)(程序存储器)
用途
-
存储程序代码:编译后的机器指令(如
.text
段)、常量数据(如.rodata
段)等。 -
掉电不丢失:程序固化在 Flash 中,重启后仍存在。
特点
-
只读或需擦除写入:运行时不可直接修改(需特殊操作,如 Flash 编程)。
-
访问速度较慢:比 RAM 慢,但容量较大(STM32 的 Flash 通常为几十 KB 到几 MB)。
-
寿命有限:Flash 有擦写次数限制(约 1 万~10 万次)。
示例
-
STM32 的
.hex
或.bin
文件烧录到 Flash 中,CPU 从 Flash 读取指令执行。
2. RAM(随机存取存储器)(数据存储器)
用途
-
存储运行时数据:包括全局变量、静态变量、栈、堆等。
-
掉电丢失:数据仅在供电时保持。
特点
-
可读写:直接通过指令(如
LDR/STR
)操作。 -
访问速度快:适合频繁读写的临时数据。
-
容量较小:STM32 的 RAM 通常为几十 KB 到几百 KB。
RAM 的细分区域
-
栈(Stack)
-
存储函数调用的临时数据(局部变量、返回地址等)。
-
由编译器自动管理,向下增长(高地址 → 低地址)。
-
-
堆(Heap)
-
存储动态分配的内存(如
malloc
分配)。 -
由程序员手动管理,向上增长(低地址 → 高地址)。
-
-
全局/静态变量区
-
存储全局变量(
.data
段)和未初始化的静态变量(.bss
段)。
-
3. 栈(Stack)与堆(Heap)
-
位置:均位于 RAM 中,但方向相反(栈向下,堆向上)。
-
管理方式:
-
栈由编译器自动管理(通过
PUSH/POP
或函数调用)。 -
堆需手动分配/释放(
malloc/free
),在单片机中较少使用。
-
-
典型问题:
-
栈溢出(Stack Overflow):函数嵌套过深或局部变量过大。
-
堆内存泄漏(Heap Leak):未释放动态内存。
-
4. 四者的关系与内存布局
内存分布示例(STM32)
plaintext
复制
Memory Address↑| 0xFFFFFFFF (不存在的地址)| ... | Heap(向上增长) ← 堆顶(Heap Top)| ... | 未使用的 RAM 空间| ... | Stack(向下增长) ← 栈顶(Stack Top)| 全局/静态变量(.data/.bss)| ↓ 0x00000000(RAM 起始地址)
Flash 与 RAM 的分工
-
Flash:存放代码和常量(只读),CPU 直接从 Flash 取指令执行。
-
RAM:存放运行时的变量和临时数据(可读写)。
5. 对比表格
特性 | Flash | RAM | 栈(Stack) | 堆(Heap) |
---|---|---|---|---|
用途 | 存储代码、常量 | 存储变量、栈、堆 | 函数调用时的临时数据 | 动态分配的内存 |
读写速度 | 慢 | 快 | 快(直接操作栈指针) | 慢(需内存管理) |
生命周期 | 永久(掉电不丢失) | 临时(掉电丢失) | 随函数结束释放 | 需手动释放 |
管理方式 | 编译器分配 | 编译器/程序员分配 | 编译器自动管理 | 程序员手动管理 |
增长方向 | 无 | 无 | 向下(高→低地址) | 向上(低→高地址) |
典型问题 | 擦写次数耗尽 | 容量不足 | 栈溢出 | 内存泄漏、碎片化 |
6. 实际开发中的关键点
Flash 相关
-
代码优化:减少 Flash 占用(如启用编译器优化
-Os
)。 -
常量存储:使用
const
关键字将常量放入 Flash(而非 RAM)。 -
固件更新:通过 Bootloader 更新 Flash 中的程序。
RAM 相关
-
全局变量最小化:避免占用过多 RAM。
-
栈大小配置:在启动文件(如
startup_stm32xxxx.s
)中设置足够栈空间。 -
堆的谨慎使用:在单片机中尽量避免动态内存分配。
调试技巧
-
内存溢出检测
-
使用调试器监视栈指针(
SP
)和堆指针。 -
在栈和堆的边界填充特定模式(如
0xDEADBEEF
),通过断点检测溢出。
-
-
链接脚本分析
-
检查
.ld
文件,明确 Flash 和 RAM 的地址分配。
-
-
内存使用统计
-
通过编译生成的
.map
文件,查看各段(.text
,.data
,.bss
)的大小。
-
7. 示例:STM32 的启动文件配置
在 STM32 的启动文件(如 startup_stm32f4xx.s
)中,Flash 和 RAM 的分配通过链接脚本(.ld
)定义:
/* 链接脚本片段 */
MEMORY
{FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* Flash 起始地址和大小 */RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K /* RAM 起始地址和大小 */
}/* 栈和堆大小的定义 */
_stack_size = 0x1000; /* 4KB 栈 */
_heap_size = 0x200; /* 512B 堆 */
相关文章:
单片机栈和堆、FALSH、区别
1. Flash(闪存)(程序存储器) 用途 存储程序代码:编译后的机器指令(如 .text 段)、常量数据(如 .rodata 段)等。 掉电不丢失:程序固化在 Flash 中࿰…...

【FL0090】基于SSM和微信小程序的球馆预约系统
🧑💻博主介绍🧑💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…...

如何把word文档整个文档插入到excel表格里?
现象: 当我们双击此文档时可以快速打开对应的word文档 实现步骤: 1、点击一下要插入的excel表格里的单元格 2、选择上方的的【插入】【附件】的下拉框下的【对象】 3、选择【由文件创建】-【浏览】 再在弹出的框中选择【桌面】,选择要插…...

PDF文档中表格以及形状解析
我们在做PDF文档解析时有时需要解析PDF文档中的表格、形状等数据。跟解析文本类似的常见的解决方案也是两种。文档解析跟ocr技术处理。下面我们来看看使用文档解析的方案来做PDF文档中的表格、图形解析(使用pdfium库)。 表格解析: 在pdfium库…...

C++20 Lambda表达式新特性:包扩展与初始化捕获的强强联合
文章目录 一、Lambda表达式的历史回顾二、C20 Lambda表达式的两大新特性(一)初始化捕获(Init-Capture)(二)包扩展(Pack Expansion) 三、结合使用初始化捕获与包扩展(一&a…...

51c自动驾驶~合集52
我自己的原文哦~ https://blog.51cto.com/whaosoft/13383340 #世界模型如何推演未来的千万种可能 驾驶世界模型(DWM),专注于预测驾驶过程中的场景演变,已经成为追求自动驾驶的一种有前景的范式。这些方法使自动驾驶系统能够更…...
go设计模式
刘:https://www.bilibili.com/video/BV1kG411g7h4 https://www.bilibili.com/video/BV1jyreYKE8z 1. 单例模式 2. 简单工厂模式 代码逻辑: 原始:业务逻辑层 —> 基础类模块工厂:业务逻辑层 —> 工厂模块 —> 基础类模块…...
FREERTOS的三种调度方式
一、调度器的调度方式 调度器的调度方式解释针对的对象抢占式调度1.高优先级的抢占低优先级的任务 2.高优先级的任务不停止,低优先级的任务不能执行 3.被强占的任务会进入就绪态优先级不同的任务时间片调度1.同等优先级任务轮流享用CPU时间 2.没有用完的时间片&…...

前端依赖nrm镜像管理工具
npm 默认镜像 :https://registry.npmjs.org/ 1、安装 nrm npm install nrm --global2、查看镜像源列表 nrm ls3、测试当前环境下,哪个镜像源速度最快。 nrm test4、 切换镜像源 npm config get registry # 查看当前镜像源 nrm use taobao # 等价于 npm…...
redis repl_backlog_first_byte_offset 这个字段的作用
repl_backlog_first_byte_offset 是 Redis 复制积压缓冲区(Replication Backlog)中的一个关键字段,其作用是 标识积压缓冲区中第一个字节对应的全局复制偏移量。 通俗解释 当主从节点断开重连时,Redis 需要通过复制积压缓冲区&am…...

JavaScript基础(BOM对象、DOM节点、表单)
BOM对象 浏览器介绍 BOM:浏览器对象模型 IEChromeSafariFireFox 三方 QQ浏览器360浏览器 window对象 window代表浏览器窗口 window.innerHeight 734 window.innerWidth 71 window.outerHeight 823 window.outerWidth 782 Navigator对象(不常用&am…...
Java Junit框架
JUnit 是一个广泛使用的 Java 单元测试框架,用于编写和运行可重复的测试。它是 xUnit 家族的一部分,专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码,确保代码的正确性和稳定性。 JUnit 的主要特点 注解驱动&…...
23种设计模式之《备忘录模式(Memento)》在c#中的应用及理解
程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式࿰…...
Seaborn知识总结
1、简介 (1)高级接口:Seaborn 提供了一组高级函数和方法,可以使得创建常见的统计图表变得简单,例如散点图、线性回归图、箱线图、直方图、核密度估计图、热图等等。无需像 Matplotlib 一样写大量的代码; …...
flowable中用户相关api
springboot引入flowable:高版本mysql报错 <!-- https://mvnrepository.com/artifact/org.flowable/flowable-spring-boot-starter --><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</art…...

java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类
(以下内容全部来自上述课程) 1.抽象类 父类定义抽象方法后,子类的方法就必须重写,抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样…...

安装 Open WebUI
2025.03.01 早上 我已经安装了ollama 和deeseek模型 (本地部署流水账之ollama安装Deepseek安装-CSDN博客),然后需要个与模型沟通的工具(这么说不知道对不对)。 刚开始用的chatbox,安装很方便,…...
Llama 2中的Margin Loss:为何更高的Margin导致更大的Loss和梯度?
Llama 2中的Margin Loss:为何更高的Margin导致更大的Loss和梯度? 在《Llama 2: Open Foundation and Fine-Tuned Chat Models》论文中,作者在强化学习与人类反馈(RLHF)的Reward Model训练中引入了Margin Loss的概念&a…...

【后端】Docker一本通
长期更新补充,建议关注收藏点赞 目录 Docker概述安装部署Docker基本操作使用docker部署tomcat使用docker部署mysql Docker概述 docker是⼀个应⽤级隔离的虚拟化技术docker三大核心概念 镜像:是具有源的所有特征的⼀个标记⽂件 仓库:存放镜像…...
工程化与框架系列(13)--虚拟DOM实现
虚拟DOM实现 🌳 虚拟DOM(Virtual DOM)是现代前端框架的核心技术之一,它通过在内存中维护UI的虚拟表示来提高渲染性能。本文将深入探讨虚拟DOM的实现原理和关键技术。 虚拟DOM概述 🌟 💡 小知识࿱…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...