单片机栈和堆、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概述 🌟 💡 小知识࿱…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
