关于分散加载表
; 非缓冲区段 - 用于通信相关变量,避免缓存一致性问题
; 该区域将被配置为non-cacheable 64kb
; 0x24070000~ 0x2407FFFF分配的地址
RW_NOCACHE 0x24070000 0x00010000 {
*(NO_CACHE_SECTION)
}这个写在分散加载表的哪个地方

在 STM32 的工程中,通常会看到 flash.sct 和 sram.sct 两个文件,它们代表了两种完全不同的运行模式:
1. 为什么选 flash_CM7.sct?(生产/正式模式)
这是绝大多数情况下的选择。
-
代码存储: 你的程序代码(RO Segment)是烧录在 Flash 里的,这样掉电后程序不会丢失。
-
变量运行: 虽然代码在 Flash 里,但变量(RW/ZI 段)必须在 RAM 里运行。
-
分散加载的作用:
flash.sct的作用是告诉链接器:“请把代码放在 Flash 地址,但在程序启动时,请把需要初始化的变量搬运到 RAM 的某个位置(比如 0x24070000)”。 -
结论: 只要你的工程是“烧录到 Flash 运行”的,你就必须在
flash.sct里定义这个 RAM 区块。
2. 为什么不选 sram_CM7.sct?(调试/RAM运行模式)
这个文件通常只在特定的“RAM 调试”场景下使用。
-
代码存储: 程序代码和变量全都放在 RAM 里,Flash 里什么都没有。
-
特点: 这种模式下,程序通过调试器直接下载到 RAM,运行速度极快且不损耗 Flash 寿命,但掉电后程序立即消失。
-
结论: 除非你当前的开发环境配置的是“RAM Debug”模式,否则修改这个文件是没有任何意义的,因为编译器根本没去读它。
核心区别:存储 vs. 执行
为了让你更直观地理解,可以参考下面这个逻辑:
| 特性 | flash_CM7.sct (你现在用的) | sram_CM7.sct |
| 程序存放在哪 | Flash (0x0800...) | RAM (0x2400... 或其他) |
| 变量存放在哪 | RAM (0x2400...) | RAM (0x2400...) |
| 掉电是否丢失 | 否 (代码还在) | 是 (全丢了) |
| 使用场景 | 正式开发、发布、固化程序 | 特殊性能测试、极限寿命调试 |
浙公网安备 33010602011771号