## RAM / ROM / Flash ## 判别规则(核心,唯一要记的) 1. **看掉电要不要还在**:要 → **Flash/ROM**;只是运行临时数据 → **RAM**(掉电丢) 2. **看读写性质**:变量/堆栈/反复改 → **RAM**(快、随便写);代码/常量/掉电保存 → **Flash**(慢、有寿命) 3. **Flash = "能写的 ROM"**:可编程但**要先擦整块、写慢、寿命约 10 万次**——运行高频数据不放它 一句话:**"掉电要留的放 Flash,运行反复改的放 RAM;Flash 能写但有块擦、寿命、速度三道坎。"** ## 抽象描述(一句话本质) 数据放哪个存储器,就看三件事:**掉电后要不要还在**(易失性)、**读写快不快**(速度)、**要不要反复改**(可写性)。 ## 三个存储器对比(一张表) | | RAM(SRAM) | Flash | ROM | | ---- | -------------------- | ------------------------------------ | ----------------------------- | | 掉电 | **丢**(易失) | **保持**(非易失) | 保持(出厂写死) | | 速度 | **最快** | 慢(比 RAM 慢很多) | 只读 | | 可写 | 随便写,无次数限制 | 能写,但**先擦整块、寿命约 10 万次** | 不能写 | | 用途 | 变量、堆栈、运行数据 | 程序代码、常量、掉电保存的数据 | 固定固件(基本被 Flash 取代) | ## 程序各段放哪(背这张) | 段 | 内容 | 存哪 | | ------------- | ---------------------------------- | ------------------------------------------- | | 代码段 | 程序指令 | **Flash**(掉电保持,上电直接执行) | | 常量(const) | 只读数据 | **Flash** | | RW-data | 已初始化为**非 0** 的全局/静态变量 | 初值存在 **Flash**,上电**拷贝到 RAM** 运行 | | ZI-data | 未初始化/初始化为 **0** 的全局 | 直接放 **RAM**(默认 0,不用存初值) | **RAM 占用 = RW-data + ZI-data + 堆 + 栈** **为什么要"初值在 Flash、运行在 RAM"**: - 变量的**当前值**必须在 RAM(掉电丢是正常的,运行时要反复改、要快) - 但非 0 的**初值**得放 Flash 里存着,每次上电拷回 RAM 恢复——不然掉电后初值就没了 - ZI-data 初值本来就是 0,上电清零即可,**不用在 Flash 占地方** ## 正反例(建立直觉) - **正例1**:程序代码 → Flash(掉电保持,上电直接执行) - **正例2**:全局变量、堆栈、缓冲 → RAM(运行反复改、要快) - **正例3**:设备参数(音量、校准值)要掉电保存 → Flash(或 EEPROM) - **反例1**:把高频更新的缓冲放 Flash → 错,写慢 + 先擦整块 + 寿命有限(每秒写一次很快磨坏) - **反例2**:把程序代码放 RAM → 错,掉电就丢,且浪费 - **反例3**:以为 RAM 掉电还在 → 错,RAM 易失 ## 易混对比 ### RAM vs Flash(最常见考题) | | RAM | Flash | | -------- | --------- | -------------------- | | 掉电 | 丢 | 保持 | | 速度 | 快 | 慢 | | 写入 | 随便写 | 先擦整块、有寿命上限 | | 典型放啥 | 变量/堆栈 | 代码/常量/参数 | ### RW-data 初值 vs 运行时值 | | 在哪 | | ----------------- | ------------------- | | 初值(非 0) | Flash | | 运行时当前值 | RAM | | 初值 0 / 未初始化 | 只放 RAM(ZI-data) | ## 变体验证(3 题,全过=学会) 1. 音量设置要重启还在 → **Flash**;但每秒改一次就不行(Flash 寿命 ~10 万次,高频写磨坏) 2. 陷阱题:"全局变量初值存放在 RAM" → **错**。非 0 初值存 Flash(RW-data)上电拷到 RAM;初值 0 直接 RAM(ZI-data) 3. 陷阱题:4KB 缓冲每秒更新 → **放 Flash 不行**(写慢 + 先擦整块 + 寿命上限),放 RAM ## 口述要点(面试怎么讲) - **结论先行**:掉电要留 → Flash;运行反复改 → RAM - **为什么代码必须放 Flash/ROM**:掉电要保留,上电要能直接执行;RAM 掉电就丢 - **为什么 Flash 不能当 RAM 用**:写前先擦整块、写慢、寿命约 10 万次;RAM 无限制 - **为什么 RW-data 初值在 Flash、运行在 RAM**:当前值放 RAM(要快、反复改),非 0 初值放 Flash 存着每次上电恢复;ZI-data 默认 0 不用存 - **易错点**:以为全局变量全在 RAM(初值在 Flash);把高频写的数据放 Flash;以为 RAM 掉电还在 ## 关系网络 | 相邻概念 | 关系 | 孤立理解会犯的错 | | ----------- | ------------------------------------------ | --------------------------------- | | 程序分段 | RW-data/ZI-data/代码段就是"放哪"的答案 | 以为所有数据都在 RAM | | 堆 vs 栈 | 都在 RAM,是运行时动态区 | 把堆栈误以为要放 Flash | | 时钟树 | Flash 读快慢影响 CPU 取指 → Flash 等待周期 | 高频时忘配 Flash 等待,取指跟不上 | | DMA | 内存→内存搬运就是 Flash→SRAM | 不知 DMA 常配在 RAM 区域 | | 掉电/低功耗 | 低功耗模式里 SRAM 掉电丢失,BKP 用电池保 | 以为待机后数据还在 | ## 学习日期 2026-08-18 --- _每主题一页,复习时只翻本目录。_