一、嵌入式系统主要存储器的分类
1.易失性存储器——RAM
(1)DRAM
DRAM,动态随机存储器(Dynamic Random Access Memory, DRAM)。所谓Dynamic(“动态”),即要求RAM需要进行不断的刷新,才能实现数据的维持。其主要原理是利用电路中电容存储电量的多寡来确定当前位是0还是1,因此工作过程中需要对电容进行持续的充电。
SDRAM,同步动态随机存储器(Synchronous Dynamic Random Access Memory, SDRAM),是DRAM的一种。在DRAM的基础上加上了时钟同步信号,在时钟沿到来时采集数据。
(2)SRAM
SRAM,静态随机存储器(Static Random Access Memory, SRAM)。所谓静态,就是不需要对内存芯片进行刷新,只要保持上电,SRAM中的数据就不会丢失。这是因为电路中有锁存器,可以对数据进行锁存。
STM32F407有四块片上SRAM:112KB SRAM1,16KB SRAM2,64KB CCM SRAM3,4KB Backup SRAM。
图源:STM32F4xx中文参考手册 p50
CCM( Core-Coupled Memory) RAM,是相比于普通SRAM更接近于处理器核心的高速内存,旨在提高数据和代码的访问速度,从而提升整个系统的性能。
(3)总结
SRAM存取速度更快,但是成本更高。通常SRAM作为cache,而DRAM作为主存。
片上SRAM的地址
图源:STM32F4xx中文参考手册 p57
备注:在别名空间中写就相当于在原始地址空间读-修改-写;在别名空间中读就相当于在原始地址空间中断读。
2.非易失性存储器——ROM、Flash
(1)EEPROM
EEPROM,电可擦除存储器(Electrically Erasable Programmable ROM) 。掉电不丢失数据。擦除过程由内部电路控制,不需要外部手动清除。可以直接读写。
(2)NOR Flash
NOR Flash,也称为NOR型闪存,是STM32片上Flash。分为多个区域。
图源:STM32F4xx中文参考手册 p59
可以根据自举配置,自主选择程序下载后储存并且运行的位置。
图源:STM32F4xx中文参考手册 p56
通常情况下, BOOT0接地,因此选择主Flash作为自举空间。也就是将程序下载到Flash中,并在Flash中运行。
(3)NAND Flash
NAND Flash由许多存储单元组成,每个存储单元可以存储一个或多个比特的数据。这些存储单元被分为页(Page)和块(Block),每页通常为2KB或4KB,每块通常为128KB或256KB。
(4)总结
NOR Flash | NAND Flash | |
---|---|---|
读取最小单位 | 字节 | 页 |
擦除最小单位 | 扇区 | 块 |
写入最小单位 | 字节 | 页 |
速度 | 读取更快 | 写入更快 |
寿命和可靠性 | 更高 | 较低,不过容量大 |
成本 | 较高 | 较低 |
二、存储区空间存储的数据类型
1.栈
存储局部变量,包括:函数内部定义的变量(未加static),函数的形式参数,函数的返回值,函数调用时的现场保护和返回地址,const修饰的局部常量。
2.堆
malloc等函数动态分配空间的变量。分配以后必须使用free释放,避免堆泄露。
3.全局区/静态区
(1).bss段
未初始化,或初始化值为0的全局变量或静态变量。不占用可执行文件的空间。
(2).data段
经过初始化且初始化值非0全局变量或静态变量,const修饰的全局变量。
4.常量区
字符串常量,不可修改。
5.代码区
程序执行代码、字符串常量。
三、存储区在存储器上的位置
SRAM | 高地址 | 栈 |
堆 | ||
全局区/静态区 | .bss段 | |
.data段 | ||
ROM/Flash | 常量区 | |
低地址 | 代码区 |