![[Pasted image 20241015105259.png]]
RAM
Random Access Memory:
a. DRAM(动态随机存取存储器)
DRAM是计算机系统中最常见的RAM类型之一。
它使用电容和电流来存储数据,并且需要刷新操作以保持数据的稳定性。
DRAM容量较大,成本相对较低,因此广泛用于主内存(RAM)。
b. SRAM(静态随机存取存储器):
SRAM是另一种常见的RAM类型,相对于DRAM来说,更快、更稳定。
它使用存储触发器(通常是互补金属氧化物半导体CMOS电路)来存储数据。
SRAM速度快,但比DRAM成本更高,一般用于高性能缓存和高速缓冲存储器。
c. SDRAM(同步动态随机存取存储器):
SDRAM是一种同步的DRAM类型,与系统主时钟同步工作。
它通过分时多通道的方式提供高速访问和数据传输。
SDRAM广泛用于计算机系统和其他需要高性能存储的设备。
d. DDR SDRAM(双倍数据率同步动态随机存取存储器):
DDR SDRAM是SDRAM的一种进化形式,提供了更高的传输速率。
它通过在每个时钟周期内传送两次数据,实现更高的带宽和更快的数据访问速度。
DDR SDRAM用于大多数现代计算机系统中的主内存。
ROM
Read-Only Memory:
a. MASK ROM(掩模只读存储器):
MASK ROM是在制造过程中被预先编程的ROM类型,无法在常规操作下进行修改。
它的数据是通过光刻等工艺制作在芯片上的,被“硬编码”进入芯片的电路结构中。
MASK ROM适用于存储固定的启动程序、固件等代码。
b. PROM(可编程只读存储器):
PROM是一种可编程的只读存储器,用户可以通过编程操作一次性地将数据写入其中。
编程操作通常由专用的编程设备或编程器完成,一旦写入数据后,数据将无法修改。
PROM适用于需要存储不可更改数据的应用,如设备固件等。
c. EPROM(可擦除可编程只读存储器):
EPROM是一种可擦除的可编程ROM,允许用户多次编程和擦除操作。
EPROM使用紫外线擦除器件来擦除数据,然后通过编程器进行重新编程。
EPROM通常用于存储需要经常更新的程序和数据的应用。
d. EEPROM(电可擦除可编程只读存储器):
EEPROM是一种电可擦除的可编程ROM,相对于EPROM,它不需要紫外线擦除器件。
EEPROM可以通过电压脉冲来擦除和编程数据,使得操作更加方便和可靠。
EEPROM广泛应用于存储配置数据、校准数据、设备序列号等的场景。
e. Flash存储器:
Flash存储器是一种基于EEPROM技术的存储器,具有非易失性和高密度的特点。
Flash存储器可以通过块擦除方式进行修改,相比EEPROM更具灵活性和可编程性。
Flash存储器广泛应用于各种存储需求,如固件存储、系统存储、可移动存储介质等。
**f.nand flash 和 nor flash
NandFlash
NAND FLASH同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取(NAND FLASH按块来擦除,按页来读,NOR FLASH没有页)。由于NAND FLASH引脚上复用,因此读取速度比NORFLASH慢一点,但是擦除和写入速度比NORFLASH快很多。NAND FLASH内部电路更简单,因此数据密度大,体积小,成本也低。因此大容量的FLASH都是NAND型的。小容量的2~12M的FLASH多是NOR型的。
NorFlash
NOR FLASH数据线和地址线分开,可以实现RAM一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。Nor 闪存可以对字进行操作,容量小可以直接和CPU总线式相连,CPU上电后直接读取,一般用作启动介质
NORFLASH可以进行字节寻址,所以程序可以在NOR FLASH中运行。嵌入式系统多用一个小容量的NOR FLASH存储引导代码,用一个大容量的NAND FLASH存放文件系统和内核。
eeprom和flash的使用场景
![[7d972551c1394139b1efc35033d0e928.webp]]
C语言和RAMROM的交互
![[Pasted image 20240611174017.png]]
单片机运行时从ROM中提取代码和变量到RAM中运行,栈中包含的函数的代码,起始地址,返回地址,局部变量,函数参数![[Pasted image 20241015101519.jpg]]
(1)代码区(text segment)。代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。
代码区的指令中包括操作码和要操作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区分配空间,然后引用该数据地址;如果是BSS区和数据区,在代码中同样将引用该数据地址。
(2)全局初始化数据区/静态数据区(Data Segment)。只初始化一次。
(3)未初始化数据区(BSS)。在运行时改变其值。
(4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C实现函数递归调用的方法。每执行一次递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。
(5)堆区(heap)。用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。
之所以分成这么多个区域,主要基于以下考虑:
**1、一个进程在运行过程中,代码是根据流程依次执行的,只需要访问一次,当然跳转和递归有可能使代码执行多次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间
2、 临时数据及需要再次使用的代码在运行时放入栈区中,生命周期短。
3、 全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。
4、 堆区由用户自由分配,以便管理。
编译
![[Pasted image 20241015150849.png]]、![[Pasted image 20241015150854.png]]
BSS段
bss段(bss segment,bss是英文Block Started by Symbol的简称),bss段属于静态内存分配。
存放程序中未初始化的全局变量和静态局部变量。BSS段中的变量在程序开始执行前没有被赋予任何值,通常这些变量会被操作系统或链接器初始化为0。BSS段不占用可执行文件的空间,它的存在只是记录了这些变量所占用的内存大小;
当程序运行时,操作系统会负责将BSS段初始化为0。这样的内存布局有助于优化程序的加载时间和减少程序的内存占用
data段
数据段(data segment),数据段属于静态内存分配。
指存放程序中已初始化的全局变量和静态局部变量、非const的全局变量的一块内存区域;
程序中已经初始化的非零的全局变量和已经初始化的非零的静态局部变量(static)
注:const全局变量一般放到了rodata段,初始化为零的全局变量可能被编译器优化到 bss段
text段
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域,程序执行时CPU会读取并执行的机器指令。
代码段大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。
在代码段中,可能包含一些只读的常数变量,例如字符串常量等。
注:1.text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
2.text段一般也包含rodata段,text段可以存放到flash中;data段也放到flash中,运行时由flash中加载到SRAM;bss段在运行时系统创建,存放到RAM中