mokongking

关于分散加载表

  ; 非缓冲区段 - 用于通信相关变量,避免缓存一致性问题

  ; 该区域将被配置为non-cacheable 64kb

  ; 0x24070000~ 0x2407FFFF分配的地址

  RW_NOCACHE 0x24070000 0x00010000 {

   *(NO_CACHE_SECTION)

  }这个写在分散加载表的哪个地方

image

在 STM32 的工程中,通常会看到 flash.sctsram.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...)
掉电是否丢失 否 (代码还在) 是 (全丢了)
使用场景 正式开发、发布、固化程序 特殊性能测试、极限寿命调试

posted on 2026-05-06 16:52  虎啸岳林  阅读(22)  评论(0)    收藏  举报

导航