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