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

单片机栈和堆、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 的细分区域
  1. 栈(Stack)

    • 存储函数调用的临时数据(局部变量、返回地址等)。

    • 由编译器自动管理,向下增长(高地址 → 低地址)。

  2. 堆(Heap)

    • 存储动态分配的内存(如 malloc 分配)。

    • 由程序员手动管理,向上增长(低地址 → 高地址)。

  3. 全局/静态变量区

    • 存储全局变量(.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. 对比表格

特性FlashRAM栈(Stack)堆(Heap)
用途存储代码、常量存储变量、栈、堆函数调用时的临时数据动态分配的内存
读写速度快(直接操作栈指针)慢(需内存管理)
生命周期永久(掉电不丢失)临时(掉电丢失)随函数结束释放需手动释放
管理方式编译器分配编译器/程序员分配编译器自动管理程序员手动管理
增长方向向下(高→低地址)向上(低→高地址)
典型问题擦写次数耗尽容量不足栈溢出内存泄漏、碎片化

6. 实际开发中的关键点

Flash 相关
  • 代码优化:减少 Flash 占用(如启用编译器优化 -Os)。

  • 常量存储使用 const 关键字将常量放入 Flash(而非 RAM)

  • 固件更新:通过 Bootloader 更新 Flash 中的程序。

RAM 相关
  • 全局变量最小化:避免占用过多 RAM。

  • 栈大小配置:在启动文件(如 startup_stm32xxxx.s)中设置足够栈空间。

  • 堆的谨慎使用:在单片机中尽量避免动态内存分配。

调试技巧
  1. 内存溢出检测

    • 使用调试器监视栈指针(SP)和堆指针。

    • 在栈和堆的边界填充特定模式(如 0xDEADBEEF),通过断点检测溢出。

  2. 链接脚本分析

    • 检查 .ld 文件,明确 Flash 和 RAM 的地址分配。

  3. 内存使用统计

    • 通过编译生成的 .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 中&#xff0…...

【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):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式&#xff0…...

Seaborn知识总结

1、简介 (1)高级接口:Seaborn 提供了一组高级函数和方法,可以使得创建常见的统计图表变得简单,例如散点图、线性回归图、箱线图、直方图、核密度估计图、热图等等。无需像 Matplotlib 一样写大量的代码; …...

flowable中用户相关api

springboot引入flowable&#xff1a;高版本mysql报错 <!-- https://mvnrepository.com/artifact/org.flowable/flowable-spring-boot-starter --><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</art…...

java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类

&#xff08;以下内容全部来自上述课程&#xff09; 1.抽象类 父类定义抽象方法后&#xff0c;子类的方法就必须重写&#xff0c;抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为&#xff08;方法&#xff09;抽取到父类之后。由于每一个子类执行的内容是不一样…...

安装 Open WebUI

2025.03.01 早上 我已经安装了ollama 和deeseek模型 &#xff08;本地部署流水账之ollama安装Deepseek安装-CSDN博客&#xff09;&#xff0c;然后需要个与模型沟通的工具&#xff08;这么说不知道对不对&#xff09;。 刚开始用的chatbox&#xff0c;安装很方便&#xff0c;…...

Llama 2中的Margin Loss:为何更高的Margin导致更大的Loss和梯度?

Llama 2中的Margin Loss&#xff1a;为何更高的Margin导致更大的Loss和梯度&#xff1f; 在《Llama 2: Open Foundation and Fine-Tuned Chat Models》论文中&#xff0c;作者在强化学习与人类反馈&#xff08;RLHF&#xff09;的Reward Model训练中引入了Margin Loss的概念&a…...

【后端】Docker一本通

长期更新补充&#xff0c;建议关注收藏点赞 目录 Docker概述安装部署Docker基本操作使用docker部署tomcat使用docker部署mysql Docker概述 docker是⼀个应⽤级隔离的虚拟化技术docker三大核心概念 镜像&#xff1a;是具有源的所有特征的⼀个标记⽂件 仓库&#xff1a;存放镜像…...

工程化与框架系列(13)--虚拟DOM实现

虚拟DOM实现 &#x1f333; 虚拟DOM&#xff08;Virtual DOM&#xff09;是现代前端框架的核心技术之一&#xff0c;它通过在内存中维护UI的虚拟表示来提高渲染性能。本文将深入探讨虚拟DOM的实现原理和关键技术。 虚拟DOM概述 &#x1f31f; &#x1f4a1; 小知识&#xff1…...

LLM可观测性实战:生产环境AI应用的监控体系建设

为什么LLM应用的监控与传统软件完全不同 传统软件监控关注的核心指标很清晰&#xff1a;响应时间、错误率、吞吐量、CPU/内存使用率。这些指标背后的系统行为是确定性的——同样的输入&#xff0c;永远产生同样的输出。LLM应用打破了这个假设。面对同样的用户输入&#xff1a;-…...

别再死记硬背公式了!用Python代码和可视化动画,5分钟搞懂RoPE旋转位置编码

用Python动画拆解RoPE&#xff1a;当词向量在Attention中跳起旋转之舞想象一下&#xff0c;如果每个词向量都能在神经网络里跳一支优雅的芭蕾&#xff0c;用旋转的角度告诉模型自己的位置——这正是RoPE旋转位置编码的魔法。传统的位置编码像是给词向量贴上编号标签&#xff0c…...

5分钟掌握SVGnest:免费开源矢量嵌套工具,让材料切割效率提升80%

5分钟掌握SVGnest&#xff1a;免费开源矢量嵌套工具&#xff0c;让材料切割效率提升80% 【免费下载链接】SVGnest An open source vector nesting tool 项目地址: https://gitcode.com/gh_mirrors/sv/SVGnest SVGnest是一款完全免费且开源的自动嵌套应用程序&#xff0c…...

AI能力认知地图:从工具体验到工程落地的系统化拆解

1. 项目概述&#xff1a;这不是一份“AI工具清单”&#xff0c;而是一份可复用的AI能力认知地图你点开这篇文章&#xff0c;大概率不是为了收藏十个网站链接——而是想搞清楚&#xff1a;当AI能力已经像水电一样开始渗入日常工具链时&#xff0c;一个真实从业者该如何判断哪些能…...

紧急!财政部新发《AI增强型审计工作指引(试行)》第4.2条直指Agent记忆泄露风险:3类必查缓存节点+2分钟自检脚本

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AI Agent审计行业应用 AI Agent在审计行业的深度渗透正重塑传统作业范式。不同于规则驱动的RPA工具&#xff0c;AI Agent具备目标分解、工具调用、多步推理与自主反馈能力&#xff0c;可动态适配审计场景中的非…...

从ISA到PCIe:为什么老电脑升级显卡要插对槽?聊聊PCI总线的那些事儿

从ISA到PCIe&#xff1a;老电脑升级显卡必须知道的插槽进化史 当你从储物间翻出一台2003年的戴尔Dimension 4600准备升级显卡时&#xff0c;会发现主板上那些长短不一的插槽仿佛在讲述一段被遗忘的技术史诗。黑色PCI插槽旁紧挨着棕色的AGP 8X&#xff0c;而最边缘那个几乎被灰尘…...

《男人来自火星,女人来自金星4:生活篇》第1-3章深度解读:大脑化学物质如何决定两性关系

前言 《男人来自火星&#xff0c;女人来自金星》系列自问世以来&#xff0c;全球销量已超过5000万册&#xff0c;被翻译成40多种语言&#xff0c;成为近几十年来最畅销的两性关系书籍之一。作为系列的第四部&#xff0c;《生活篇》&#xff08;也被称为《健康篇》&#xff09;从…...

taotoken的按token计费模式如何帮助个人开发者控制实验成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken的按Token计费模式如何帮助个人开发者控制实验成本 对于个人开发者、学生或独立研究者而言&#xff0c;在探索AI应用或进行…...

GEO服务商技术评估的四维量化框架:以杭州文澜天下科技为例

评估维度如下。评估维度一&#xff1a;技术自研深度&#xff08;权重30%&#xff09;行业数据显示&#xff0c;当前市场上超千家宣称提供GEO服务的机构中&#xff0c;仅19%拥有完整的自主技术研发团队&#xff0c;超73%的品牌选错服务商&#xff0c;导致二次重构投入成本达到首…...

不止于安装:在Ubuntu上为Arduino IDE 2.x手动添加冷门芯片支持(以LGT8F328P为例)

不止于安装&#xff1a;在Ubuntu上为Arduino IDE 2.x手动添加冷门芯片支持&#xff08;以LGT8F328P为例&#xff09; 当你在Ubuntu上完成Arduino IDE 2.x的基础安装后&#xff0c;真正的挑战才刚刚开始。对于那些非官方支持的开发板&#xff0c;如LGT8F328P&#xff0c;标准的库…...