这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 为什么SRAM空间未在sct表内划分

共1条 1/1 1 跳转至

为什么SRAM空间未在sct表内划分

院士
2026-09-15 18:23:11     打赏

sct文件,即Keil MDK开发环境中的分散加载文件(Scatter File)。其作用是用来描述程序在SRAM和Flash中的布局,这个文件的后缀通常为.sct,它是 Keil 工程中控制"代码和数据放在哪里"的核心配置。当你的目标内存空间未在sct文件里面描述,Keil MDK会怎么办呢?

链接阶段:完全忽略与禁止分配

sct文件是链接器的map。链接器只会在.sct文件中明确定义的加载区(Load Region)和执行区(Execution Region)内分配代码段(.text)、数据段(.data/.bss)等,任何未被.sct文件覆盖的地址空间,对链接器而言是“不存在”或“不可用”的。 换句话说,链接器绝不会自动将任何数据、代码或栈堆分配到未声明的内存区域。

如果在此阶段,我们使用了未定义的地址空间,即尝 试通过__attribute__((section("name")))将变量或函数强制指定到未定义的区域,则链接器会报错。从另外一角度保证了我们的代码,或者编写时不会“越界”,算是一个“双保险”吧!

运行阶段:保持硬件初始状态

由于链接器没有向该区域写入任何数据,也没有生成任何初始化代码(如C库启动代码中的scattercopy或zeroinit)来操作该区域,因此上电或复位后该内存区域的内容完全取决于MCU硬件复位后的默认状态:

  • SRAM‌:通常保持为复位时的随机值(Power-on Random Value)

  • Flash‌:保持为出厂默认值(通常为全0xFF)或之前烧录留下的残留数据

高级使用:故意不定义

在某些高级应用中,开发者会特意在.sct中留出部分物理内存不定义,目的是:

  • 保留给Bootloader/IAP:预留Flash扇区用于存储备份固件或配置参数,防止主应用程序链接时覆盖。

  • 共享内存区:在多核或多程序跳转场景中,预留一段RAM作为通信缓冲区,确保主程序重启或跳转时不会清零或修改该区域数据(因为标准启动代码只会清零.sct中定义的.bss段)

  • 外部存储器映射:对于外挂的SDRAM或SPI Flash,如果仅用于存储非执行数据(如字库),有时会通过手动指针访问而非链接器自动分配,此时.sct中可能不包含该区域,或者仅将其定义为特殊的加载区而不参与常规段分配。

总结

sct文件这张map需要认真对待。是我们项目硬件资源的约束,也是我们项目稳定,可靠的一重保障。





关键词: sct    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]