TM32之sct分散加载描述文件
在 STM32嵌入式开发 中,分散加载文件(.sct或.ld文件)是ARM编译器用来定义代码和数据在存储空间的布局的链接脚本。它告诉编译器如何将代码和数据分配到不同的存储区域(如Flash、RAM、TCM等)。合理使用分散加载文件可以优化性能、提高实时性,甚至增强系统稳定性。
STM32的sct分散加载描述文件如下:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}
对上述分散加载文件逐行解析如下:
一、定义加载区域(Load Region)
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
LR_IROM1:加载区域名称(自定义)。0x08000000:加载区域起始地址(STM32 程序运行 起始地址,可以重映射)。0x00020000:区域大小(128KB, 加载区容量)。- 作用:定义 Flash 或其他内存的存储范围,代码和常量在此区域存放。
2)定义执行区域(Execution Region)
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
ER_IROM1:执行区域名称(与加载区域名称可以不同)。0x08000000:执行地址(与加载地址相同,表示代码在 Flash 中原地执行)。0x00020000:区域大小(需 ≤ 加载区域大小)。- 作用:代码实际运行时仍位于 Flash 中。
(3)指定复位向量和启动代码
*.o (RESET, +First)
*.o (RESET, +First)*.o:匹配所有目标文件。(RESET):选择所有名为RESET的段(通常包含中断向量表)。+First:强制将该段放在该区域的起始地址。- 作用:确保中断向量表位于
0x08000000(STM32 上电将从此处加载SP和PC指针)。
(4)C 库初始化段
*(InRoot$$Sections)
InRoot$$Sections:ARM 编译器的内置命名,包含 C 库初始化所需的代码和数据(如__main的堆栈初始化代码)。- 作用:处理 C 运行时环境的初始化。
(5)所有只读代码和常量
.ANY (+RO)
.ANY:匹配所有未被分配的目标文件。+RO:选择只读(Read-Only)段(包括代码.text和常量.constdata)。- 作用:将程序代码和常量放入 Flash。
(6)所有可执行的只读代码
.ANY (+XO)
+XO:选择可执行(eXecute Only)段(某些安全芯片需要代码加密后执行)。- 注意:STM32 通常不使用此属性,代码默认可读可执行(
+RO已包含)。
(7)定义 RAM 区域
RW_IRAM1 0x20000000 0x00020000 { ; RW data
RW_IRAM1:RAM 执行区域名称。0x20000000:STM32 内置 RAM 起始地址。0x00020000:区域大小(128KB,取决于具体型号)。- 作用:定义读写变量的存储位置。
(8)分配读写数据和零初始化数据
.ANY (+RW +ZI)
+RW:选择已初始化的读写数据(如全局变量int a = 5;)。+ZI:选择零初始化数据(如全局变量int b;)。- 关键流程:
- 上电时,
+RW数据从 Flash 拷贝到 RAM。 +ZI数据由启动代码在 RAM 中清零。
- 上电时,

浙公网安备 33010602011771号