当前位置: 首页 > 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…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...