单片机中的存储器讲解

单片机中的存储器

目录

常用的存储器

易失性存储器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 a1000000这样的超大数组。

堆区

heap

RW

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

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

内存碎片:

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

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

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

静态区

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)数据区域

    在编译后可以看到

FLASH
Code(.text) 程序代码部分 程序代码区(code)
RO-data(.data) 存储const常量和指令 文字常量区
SRAM
RW-data (.data) 存储初始化值不为0的全局变量,静态变量 栈区(stack)堆区(heap)全局区(静态区)(static)
ZI-data(.bss) 存储未初始化的全局变量或初始化值为0的全局变量,静态变量
相关推荐
不上岸的旱鸭子几秒前
PCB设计
单片机·pcb工艺
吠品4 分钟前
多语言支持,从后台到前端我都趟过哪些坑
stm32·单片机·嵌入式硬件
AOwhisky20 分钟前
Python 学习笔记(第六期)——函数:定义、参数传递与作用域
笔记·python·学习·云原生·运维开发·函数·参数传递
网小鱼的学习笔记22 分钟前
Agent学习001
学习·迁移学习
炸膛坦客33 分钟前
单片机/C/C++八股:(二十三)#define 和 typedef 的区别
c语言·c++·单片机
白帽小阳1 小时前
我的AI辅助开发工具链2026版:从编码到部署的全栈智能实践
网络·人工智能·学习·安全·自动化
zlinear数据采集卡1 小时前
硅片里的“自动纠错“:硬核拆解LHAMP188自动归零技术原理与三种封装的PCB布局实战
arm开发·单片机·嵌入式硬件·fpga开发·开源
2401_888859712 小时前
STM32H7外部flash(W25Q128)+SPI+DMA读写
stm32·单片机·嵌入式硬件
有Li2 小时前
通过渐进式域变换实现组织分类的无监督单域泛化文献速递/基于多模态的医学影像分割与理解
人工智能·学习·分类·数据挖掘·文献·医学生
Industio_触觉智能2 小时前
开源鸿蒙OpenHarmony再进阶,OneConnect规范即将升级为国家级行业标准
嵌入式硬件·物联网·硬件架构·智能硬件·openharmony·开源鸿蒙