读写缓存与访问属性

← 返回 存储器访问 | ← 主页


  1. 访问属性决定 CPU 怎么访问这片内存: 同一个地址空间,不同区域可以被标成 Normal(普通内存)、Device(设备内存)、Strongly-ordered(强顺序内存), 也可以带 Cacheable(可缓存)、Bufferable(可写缓冲)、Shareable(可共享)、Executable(可执行)等属性。 MPU 配 region 时,本质就是给一段地址贴访问属性标签。
  2. 读缓存出现的位置: 对 Cortex-M3/M4 来说,重点是 Flash 加速器 / 预取缓冲 / 指令缓存,而不是通用 D-Cache。 STM32F4 系列有 Flash 侧的 ART / 指令缓存 / 数据缓存 / 预取缓冲,用来加速从 Flash 取指令和读常量; 顺序执行时,Flash 控制器会提前把后续指令(I-Code)或一整行数据(D-Code)搬进缓冲区,命中后 CPU 不必每次都重新等待 Flash。 这里的“数据缓存”主要是 Flash 侧缓存,不是 Cortex-M7 那种覆盖 SRAM/DMA 数据的通用 D-Cache。
  3. 写缓存出现的位置: CPU 到总线之间常有 Write Buffer。 CPU 执行 STR 后,数据先进入写缓冲,CPU 可以继续执行后续指令; 写缓冲再慢慢把数据送到 SRAM、外设或总线目标。 如果目标区域允许 Bufferable,CPU 不必等总线真正写完就能继续跑; 遇到 DSB、外设强顺序访问、异常切换等需要同步的点,CPU 会等待前面的写操作真正完成。 普通 RAM 可以缓冲,外设寄存器通常按 Device 属性处理,不能像普通内存那样随便合并、乱序。
  4. 能省多少周期: 这里主要针对 Cortex-M3/M4 从 Flash 取指令/读常量。 CPU 频率高于 Flash 单次访问能力时,Flash 控制器会插入 wait state; 若指令预取、Flash Cache、ART 命中,就可以少等这些 wait state。 例如本来一次 Flash 访问要等 3~5 个周期,命中后可能接近 0 等待或少数周期;具体节省多少取决于芯片频率、Flash 延迟配置和访问是否连续。
  5. 一致性管理: Cortex-M3/M4 通常没有通用 D-Cache,所以 DMA 访问 SRAM 时一般不需要 Clean / Invalidate D-Cache。 需要注意的是写缓冲和流水线:改外设寄存器、MPU、VTOR、代码区属性后,常配合 DSB + ISB,确保前面的写操作完成、后面的指令按新状态重新取(详细看屏障指令)。 若具体芯片额外带外部存储 Cache 或特殊总线缓存,则按芯片手册处理。
  6. 实际使用原则: 裸机写普通变量一般不用管访问属性; 写外设寄存器用厂商头文件里的 volatile 结构体; 涉及 DMA、外部 RAM、MPU、Flash 预取/加速、启动跳转、自修改代码时,才需要认真处理 Cacheable / Bufferable / Shareable 和屏障指令。