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 中清零。

posted @ 2025-10-27 20:27  比特向阳  阅读(12)  评论(0)    收藏  举报