单片机中的存储器
目录
- 单片机中的存储器
- 常用的存储器
- 易失性存储器RAM
- SRAM
- DRAM
- 非易失性存储器ROM
- Mask ROM
- PROM
- EPROM
- E2PROM
- Flash
- NOR Flash
- NADN Flash
- 单片机里全局变量、局部变量、堆、栈的存储区域
- 区域介绍
- 栈区
- 堆区
- 静态区
- 代码区
- 常量区
- 内存分区分类
- 四个区域
常用的存储器
易失性存储器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的全局变量,静态变量 |