单片机栈和堆、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概述 🌟 💡 小知识࿱…...
SEO_资深专家分享SEO内容优化的核心方法
SEO内容优化的核心方法:资深专家分享 在当今竞争激烈的互联网时代,搜索引擎优化(SEO)已经成为提升网站流量和品牌知名度的关键。资深专家在SEO领域积累了丰富的经验,他们提出了许多实用的方法来优化内容。本文将详细探…...
DXVK 2.7.1:Linux游戏图形性能的终极Vulkan转换层深度解析
DXVK 2.7.1:Linux游戏图形性能的终极Vulkan转换层深度解析 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk DXVK 2.7.1作为基于Vulkan的Direct3D 8/9/10/11转…...
Altium Designer 22 实战:用这个隐藏技巧,为DIP插件焊盘穿上‘防烫服’
Altium Designer 22实战:用丝印层为DIP焊盘打造双重防护 手工焊接DIP插件时,烙铁温度过高或操作不当导致绿油层损坏,进而引发短路问题,是硬件工程师经常遇到的痛点。特别是在生产线上,工人为了效率往往将烙铁温度调至最…...
业务流程及业务流程优化
业务流程业务流程是指为了实现特定业务目标,将一系列相互关联的活动、任务按照一定的顺序和规则进行组织和执行的过程。它涵盖了从业务起始到结束的整个过程,涉及到人员、设备、信息等多种资源的协调与运用。以下是对业务流程的详细阐述:构成…...
用PyTorch和TorchText搞定AG_NEWS新闻分类:从数据加载到75%准确率的保姆级代码
用PyTorch和TorchText实现AG_NEWS新闻分类:从零到75%准确率的完整指南 当你第一次接触文本分类任务时,可能会被数据处理和模型构建的复杂性吓到。本文将带你用PyTorch和TorchText从零开始构建一个新闻分类器,无需任何先验知识,只需…...
3种突破限制方案让窗口尺寸控制效率提升60%
3种突破限制方案让窗口尺寸控制效率提升60% 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾遇到这样的困扰:重要的应用程序窗口被固定尺寸无法调整,…...
KART-RERANK在.NET生态中的集成:为C#应用注入AI排序能力
KART-RERANK在.NET生态中的集成:为C#应用注入AI排序能力 你是不是也遇到过这样的场景?自己开发的C#应用里,有一个搜索或者推荐功能,用户输入关键词,系统返回一堆结果。但问题是,这些结果往往只是按照最基础…...
Z-Image-Turbo广告设计:多语言海报生成系统
Z-Image-Turbo广告设计:多语言海报生成系统 1. 引言 电商商家每天需要制作大量商品海报,人工设计成本高且效率低。传统设计流程需要找设计师、反复沟通修改,一张海报从构思到完成往往需要数小时甚至数天时间。对于需要覆盖多个市场的品牌来…...
BetterJoy控制器配置终极指南:从零开始快速掌握Switch手柄PC使用技巧
BetterJoy控制器配置终极指南:从零开始快速掌握Switch手柄PC使用技巧 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https:…...
避开PLC烧毁陷阱:FX3S晶体管输出必须知道的7个细节(含虚设电阻计算)
避开PLC烧毁陷阱:FX3S晶体管输出必须知道的7个细节(含虚设电阻计算) 在工业自动化现场,FX3S系列PLC的晶体管输出模块烧毁问题堪称"隐形杀手"。去年某汽车生产线因一个0.5A保险丝选型错误导致全线停产8小时,损…...
