单片机中的存储器讲解

单片机中的存储器

目录

常用的存储器

易失性存储器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)函数释放内存。 是,两个紧密挨着定义的局部变量,他们的存储空间是紧挨着的。
生长方向 按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。
存储的类型 那些在编译期间不能确定存储大小的变量的存储区 用于在函数作用域内创建,在离开作用域后自动销毁的变量的存储区。通常是局部变量,函数参数等的存储区。

静态区

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的全局变量,静态变量
相关推荐
Chef_Chen2 分钟前
从0开始学习机器学习--Day19--学习曲线
人工智能·学习·机器学习
lucy153027510791 小时前
【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者
人工智能·科技·单片机·嵌入式硬件·算法·机器学习
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
infiniteWei2 小时前
【Lucene】原理学习路线
学习·搜索引擎·全文检索·lucene
follycat3 小时前
[极客大挑战 2019]PHP 1
开发语言·学习·网络安全·php
并不会7 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
龙鸣丿7 小时前
Linux基础学习笔记
linux·笔记·学习
Nu11PointerException9 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
@小博的博客12 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生13 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法