单片机中的存储器讲解

news/2024/9/18 14:59:03/ 标签: 单片机, 嵌入式硬件, stm32, 学习

单片机中的存储器

目录

  • 单片机中的存储器
    • 常用的存储器
      • 易失性存储器RAM
        • SRAM
        • DRAM
      • 非易失性存储器ROM
        • Mask ROM
        • PROM
        • EPROM
        • E2PROM
        • Flash
          • NOR Flash
          • NADN Flash
  • 单片机里全局变量、局部变量、堆、栈的存储区域
    • 区域介绍
      • 栈区
      • 堆区
      • 静态区
      • 代码区
      • 常量区
    • 内存分区分类
      • 四个区域

常用的存储器

image-20240817162143170

易失性存储器RAM

RAM,随机访问存储器(Random Access Memory),易失性存储器,它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。它的作用是当开机后系统运行占一部分外,剩余的运行内存越大,手机速度越快,运行的程序越多,剩余越少。

SRAM

静态随机存取存储器(Static Random Access Memory,SRAM)是随机存取存储器的一种,所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。但是掉电了就会丢失

速度非常快,一般用在电脑的CPU,高速缓存

DRAM

动态随机存取存储器(Dynamic Random Access Memory),最为常见的系统内存。DRAM 只能将数据保持很短的时间。为了保持数据,DRAM使用电容存储,所以必须隔一段时间刷新一次,所以一般会给他配一个扫描电路,每隔一段时间就扫描数据并给他补电,如果存储单元没有被刷新,存储的信息就会丢失。

SRAM 比较快、贵

DRAM 比较慢,便宜

非易失性存储器ROM

Mask ROM

只读存储器

PROM

Programmable ROM:可编程ROM,只能被编程一次

EPROM

Erasable Programmable ROM,EPROM:可擦写可编程ROM,擦写可达1000次

紫外线照射30min就可擦除

E2PROM

Electrically Erasable Programmable ROM:电子可擦除EPROM

Flash

闪存(flash memmory):基于EEPROM,它已经成为一种重要的存储技术。固态硬盘(SSD),U盘(软盘),光盘等

const 修饰的全局变量,它是只读的,存放在 flash 中的只读数据区域

NOR Flash

用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本

读取的速度较快,但写入的速度慢

根据外部接口分,可分为普通接口和SPI接口的Nor Flash,多数支持CFI接口,所以,一般也叫做CFI接口

NADN Flash

它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR Flash来运行启动代码。

写入的速度快、价格较低

固态硬盘(Solid State Drive, SSD)也是以 NAND 型 Flash 为基础所建构的储存装置

单片机里全局变量、局部变量、堆、栈的存储区域

区域介绍

区域作用
内存栈区存放局部变量名
内存堆区存放new或者malloc出来的对象
文字常量区存放局部变量或者全局变量的值
(全局区)静态区用于存放全局变量或者静态变量
代码区二进制代码

栈区

stack

RW

通常是用于那些在编译期间就能确定存储大小的变量的存储区,

栈的大小是有限的,通常Visual C++编译器的默认栈的大小为1MB,所以不要定义int a[1000000]这样的超大数组。

堆区

heap

RW

它与数据结构中的堆是两回事,分配方式类似于链表

如果程序员分配了却没有释放掉,那么就会出现常说的内存泄漏问题

内存碎片:

需要注意的是,两个紧挨着定义的指针变量,所指向的malloc出来的两块内存并不一定的是紧挨着的,所以会产生内存碎片。

另外需要注意的一点是,堆的大小几乎不受限制,理论上每个程序最大可达4GB。
每个线程都会有自己的栈,但是堆空间是共用的。

堆heap栈stack
分配方式一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。由编译器自动分配释放
存储空间是否连续否,一般由malloc(或new)函数来分配内存块,并且需要用free(delete)函数释放内存。是,两个紧密挨着定义的局部变量,他们的存储空间是紧挨着的。
生长方向按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。
存储的类型那些在编译期间不能确定存储大小的变量的存储区用于在函数作用域内创建,在离开作用域后自动销毁的变量的存储区。通常是局部变量,函数参数等的存储区。
image-20240817181920441

静态区

static

RW

全局变量和静态变量的存储

初始化的放在 RW(可读可写)区域

未初始化的放在相邻的 ZI区域(零初始化数据区)

代码区

RO-只读(ReadOnly)

code

存放函数体的二进制代码

常量区

RO

常量字符串就是放在这里的

被包含在flash中,程序结束后由系统自动释放

内存分区分类

单片机内存被总分为flash(rom)和sram(ram)

flash里面的数据掉电可保存,sram中的数据掉电就丢失,sram的执行速度要快于flash,flash容量大于sram

我们正常下载程序都是下载存储进flash里面,这也是为什么断电可保存的原因

四个区域

单片机的程序存储分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区) 和 ZI-data(零初始化数据区)

  • Flash 存储 code和RO-data

  • SRAM存储 RW-data 和ZI-dat

    const 修饰的全局变量,它是只读的,存放在 flash 中的只读(RO)数据区域

    在编译后可以看到

    image-20240817175344240

FLASH
Code(.text)程序代码部分程序代码区(code)
RO-data(.data)存储const常量和指令文字常量区
SRAM
RW-data (.data)存储初始化值不为0的全局变量,静态变量栈区(stack)堆区(heap)全局区(静态区)(static)
ZI-data(.bss)存储未初始化的全局变量或初始化值为0的全局变量,静态变量

http://www.ppmy.cn/news/1516795.html

相关文章

QT常用UI控件

目录 一、引言 二、QT常用UI控件概述 1.按钮(QPushButton) 2.文本框(QLineEdit) 3.标签(QLabel) 4.下拉列表(QComboBox) 5.单选按钮(QRadioButton) 6.复选框…

【OpenCV】SIFT(尺度不变特征变换)算法?

关键词:SIFT Algorithm 文章目录 一、介绍二、什么是 SIFT 算法?2.1 SIFT 算法描述2.2 SIFT 算法示例 三、人类与机器识别3.1 SIFT 在计算机视觉中的应用3.2 SIFT 关键点的优势3.3 示例演示 四、关键点定位关键点选择 五、实验任务指导5.1 计算大小和方…

博弈论详解 2(SG函数 和 SG定理)

传送门:博弈论详解 1(基本理论定义 和 Nim 游戏) 什么是 SG 函数 接着上次的讲解,我们来了解一个更通用的模型。我们把每一个状态变成一个点(在 Nim 游戏里就代表 a a a 数组),如果可以从一种…

安装Win10操作系统时找不到任何驱动器的解决方法

安装Win10操作系统时找不到任何驱动器的解决方法 有时候在一台新电脑上使用U盘安装系统时提示:我们找不到任何驱动器。 如下图所示: 解决方法: 一、按F12(不同电脑进入Bios的按键可能不同)将电脑进入Bios画面&#xf…

DataX(Doris同步数据到SelectDB)

背景 由于之前的doris数仓在本地的服务器,当数据量越来越大,服务器的性能达不到要求,查询数据经常超时,故需要把本地的doris数仓部署到云上,本文以阿里云为例,迁移工具使用的阿里开源的datax。 datax官方文…

client网络模块的开发和client与server端的部分联动调试

客户端网络模块的开发 我们需要先了解socket通信的流程 socket通信 server端的流程 client端的流程 对于closesocket()函数来说 closesocket()是用来关闭套接字的,将套接字的描述符从内存清除,并不是删除了那个套接字,只是切断了联系,所以我们如果重复调用,不closesocket()…

20240828 每日AI必读资讯

8岁女孩玩转AI编程,45分钟打造聊天机器人,Karpathy都看呆了 - 新晋顶流AI代码编辑器——Cursor,已经进化到了“0手工代码”阶段。 - 提供了多个AI模型,包括GPT-4、GPT-4o和Claude 3.5 Sonnet等,可以通过跟大模型聊天…

微服务——远程调用

为什么需要远程调用? 在微服务架构中,每个服务都是独立部署和运行的,它们之间需要相互协作以完成复杂的业务逻辑。因此,远程调用成为微服务之间通信的主要方式。通过远程调用,一个服务可以请求另一个服务执行某些操作或…

【Python机器学习】NLP概述——词序和语法

词的顺序很重要,那些在词序列(如句子)中控制词序的规则被称为语言的语法(也被称为文法)。这是之前的词袋或词向量例子中所丢弃的信息。在大多数简短的短语甚至许多完整的句子中,上述词向量近似方法都可以奏…

设计模式 7 桥接模式

设计模式 7 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff0…

整合sentinel遇到的小问题

1.运行jar包 ,端口为默认8080 正确命令 java -Dserver.port8090 -Dcsp.sentinel.dashboard.server127.0.0.1:8090 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.6.jar -D这些指令要在 -jar前面 在宝塔部署时,直接复制到运行命令后…

vue事件监听

我们可以使用 v-on 指令 (简写为 ) 来监听 DOM 事件,并在事件触发时执行对应的 1.回车事件(点击回车触发) confirm 适用uni-app keyup.enter 适用vue3 运用场景:通常在文本框输入的时候使用 2.点击事件(鼠标左键…

Cubase操作:如何修改每个音频块的名字 写歌习惯

如何修改每个音频块的名字 我对命名比较注重,之前用Cubase12,导入我手机中编辑过的Cubasis的工程时,发现中文部分有乱码…… 而且好像改名改得很费劲…… 后面通过多方咨询和探索思考,终于找到方法了! 可以先把信息…

【C#】【EXCEL】BumblebeeComponentsAnalysisGH_Ex_Ana_CondTopCount

这段代码定义了一个名为 GH_Ex_Ana_CondTopCount 的 Grasshopper 组件。它的主要功能是为 Excel 中的一个范围添加条件格式,具体是根据数值的大小高亮显示前N个(或后N个)数值。以下是该组件的详细介绍: 功能概述: 组件…

灵办AI搜索引擎和文档总结工具

前言—— 在信息爆炸的时代,如何高效地获取和处理知识成为了每个人面临的挑战。随着人工智能技术的迅猛发展,本文将深入探讨这一创新工具的功能与优势,以及如何在日常生活和工作中充分利用它,开启智能化的信息获取新篇章。 点击…

Part3-DOM学习笔记-操作元素

5.操作多个元素 5.1 排他思想 前面所述均为操作一个元素,给一个元素注册事件,如果是一组元素,就需要用循环的方式给元素注册事件。 我们想要给当前的元素实现某种样式,而其他的元素没有这个样式,这就需要用到排他思…

P2709 小B的询问

*原题链接* 非常简单的莫队板子题,让我们求出区间[l,r]中每个数出现次数的平方和,设枚举到,原来答案是res,如果加上后,则原来的变为,即res相比原来加上,删除同理。知道如何维护一个数的添加和删除后&#…

WIFI 配网

配网:指的是外部向WiFi模块提供SSID和密码,以便Wi-Fi模块可以连接指定的热点 常见的配网方式有:-键配网smart config、SoftAP配网、蓝牙配网、屏幕配网。 1.0 一键配网 2.0 蓝牙配网 一键配网的模式对应的厂加模式 3.0 状态机WIFI模组物联网 4.0 创建枚举结构体 ty…

Vue3.0项目实战(二)——大事件管理系统登录注册功能实现

目录 1. 登录注册页面 [element-plus 表单 & 表单校验] 1.1 注册登录 静态结构 & 基本切换 2. 注册功能 2.1 实现注册校验 2.2 注册前的预校验 2.3 封装 api 实现注册功能 3. 登录功能 3.1 实现登录校验 3.2 登录前的预校验 & 登录成功 1. 登录注册页面 […

Go反射四讲---第三讲:如何使用反射操作函数,获取函数的相关信息?

反射-函数 这是我们反射四讲的第三讲,本次给大家讲解如何使用反射处理函数相关的操作。 在这一部分,向大家展示如何输出方法的信息并执行调用。 输出信息,包含方法名,方法参数,返回值。 最后,如何使用反…