单片机中的存储器讲解

单片机中的存储器

常用的存储器

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的全局变量,静态变量
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值