MCU(微控制器单元)内部的 RAM 和 Flash 是最关键的两种存储器,它们直接影响MCU的性能、功耗和编程方式。以下是它们的详细讲解及作用:
1. RAM(随机存取存储器)
1.1 特性
1)易失性:断电后数据丢失。
2)高速读写:比Flash快得多(纳秒级访问)。
3)随机访问:可直接读写任意地址。
4)通常容量较小:从几KB到几MB(取决于MCU型号)。
1.2 类型
1)SRAM(静态RAM)
无需刷新电路,速度快,但成本高,占用面积大。主要用于高速缓存或小容量RAM(如STM32的CCM RAM)。
2)DRAM(动态RAM)
需要定期刷新,集成度高,成本低,但MCU通常不内置(多见于外部扩展RAM)。
1.3 作用
1)存储运行时变量:全局变量、局部变量、数组、结构体等。
2)堆栈(Stack):存储函数调用时的返回地址、局部变量、寄存器状态等。如果堆栈溢出(Stack Overflow),程序会崩溃。
3)堆(Heap):动态内存分配(如malloc()
),但嵌入式系统通常避免使用(容易导致内存碎片)。
4)数据缓冲区:如串口接收缓存、DMA传输数据存放区等。
1.4 典型应用
在STM32F103中,RAM可能是 20KB,用于存储:全局变量(
.data
段);未初始化的变量(.bss
段);堆栈(由启动文件配置大小)
2. Flash(闪存)
2.1 特性
1)非易失性:断电后数据不丢失。
2)可擦写:支持多次编程(寿命约 1万~10万次)。
3)较慢的写入速度:擦除和写入需要较长时间(微秒~毫秒级)。
4)容量较大:从几十KB到几MB(取决于MCU型号)。
2.1 类型
1)Nor Flash:支持 XIP(eXecute In Place),CPU可直接从Flash执行代码,无需全部加载到RAM。主要用于存储程序代码(如STM32的Flash)。
2)Nand Flash:容量大、成本低,但需要坏块管理,一般用于外部存储(如eMMC、SD卡)。
2.2 作用
1)存储程序代码(.text段):编译后的固件(.bin
/ .hex
文件)烧录到Flash。
2)存储常量数据(.rodata段):如const
变量、字符串常量、查找表等。
3)存储非易失性数据:如系统配置、校准参数、日志等(需注意擦写寿命)。
2.3 典型应用
在STM32F103中,Flash可能是 64KB~512KB,用于存储:程序代码(.text
);只读数据(.rodata
);初始化数据(.data
在启动时从Flash加载到RAM)。
3. RAM vs Flash 对比汇总
特性 | RAM | Flash |
---|---|---|
易失性 | 断电数据丢失 | 断电数据保留 |
读写速度 | 极快(ns级) | 较慢(µs~ms级写入) |
寿命 | 无限次读写 | 约1万~10万次擦写 |
用途 | 运行时变量、堆栈 | 程序代码、常量数据 |
典型容量 | 几KB~几MB | 几十KB~几MB |
4. 常见问题 & 注意事项
4.1 RAM不足怎么办?
1)优化数据结构(如用uint8_t
代替int
)。
2)减少全局变量,多用局部变量(栈内存)。
3)避免动态内存分配(malloc
),防止内存碎片。
4.2 Flash寿命如何管理?
1)减少频繁写入(如日志采用循环缓冲区)。
2)关键数据存储到 EEPROM 或 FRAM(如STM32的Option Bytes)。
4.3 代码如何执行?
1)XIP(就地执行):大多数ARM MCU直接从Flash运行代码,节省RAM。
2)部分加载到RAM:对性能关键代码(如中断服务程序)可复制到RAM执行。
5. 总结
1)RAM:存储运行时数据,速度快但容量小,需合理管理。
2)Flash:存储程序代码和常量,非易失但写入慢,需注意擦写次数。
3)协作方式:
上电后,CPU从Flash读取代码执行。变量和堆栈在RAM中动态分配。常量数据(如const
)存放在Flash,运行时无需加载到RAM。