这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » KeilMDK的sct分散加载文件格式说明

共1条 1/1 1 跳转至

KeilMDK的sct分散加载文件格式说明

院士
2025-12-01 15:49:42     打赏

上一次咱们认真学习了SCT分散加载文件是什么?如何在既有工程下生成sct文件?本次我们详细学习一下其文件格式设计,我们先复习一下上次生成的sct文件,数据如下:

; *************************************************************  
; *** Scatter-Loading Description File generated by uVision ***  
; *************************************************************  
  
LR_IROM1 0x08000000 0x0001B000  {    ; load region size_region  
  ER_IROM1 0x08000000 0x0001B000  {  ; load address = execution address  
   *.o (RESET, +First)  
   *(InRoot$$Sections)  
   .ANY (+RO)  
   .ANY (+XO)  
  }  
  RW_IRAM1 0x20002000 0x00020000  {  ; RW data  
   .ANY (+RW +ZI)  
  }  
}

sct文件格式

load_region_name  start_address | "+"offset  [attributes] [max_size]
{
    execution_region_name  start_address | "+"offset  [attributes][max_size]
    {
        module_select_pattern  ["("
                                    ("+" input_section_attr | input_section_pattern)
                                    ([","] "+" input_section_attr | "," input_section_pattern)) *
                               ")"]
    }
}

load_region:       加载区,用来保存永久性数据(程序和只读变量)的区域;
execution_region:  执行区,程序执行时,从加载区域将数据复制到相应执行区后才能被正确执行;
load_region_name:  加载区域名,用于“Linker”区别不同的加载区域,最多31个字符;
start_address:     起始地址,指示区域的首地址;
+offset:           前一个加载区域尾地址+offset 做为当前的起始地址,且“offset”应为“0”或“4”的倍数;
attributes:        区域属性,可设置如下属性:
                    PI       与地址无关方式存放;
                    RELOC    重新部署,保留定位信息,以便重新定位该段到新的执行区;
                    OVERLAY  覆盖,允许多个可执行区域在同一个地址,ADS不支持;
                    ABSOLUTE 绝对地址(默认);
max_size:          该区域的大小;
execution_region_name:执行区域名;
start_address:     该执行区的首地址,必须字对齐;
+offset:           同上;
attributes:        同上;
                    PI          与地址无关,该区域的代码可任意移动后执行;
                    OVERLAY     覆盖;
                    ABSOLUTE    绝对地址(默认);
                    FIXED       固定地址;
                    UNINIT      不用初始化该区域的ZI段;
module_select_pattern: 目标文件滤波器,支持通配符“*”和“?”;
                        *.o匹配所有目标,* (或“.ANY”)匹配所有目标文件和库。
input_section_attr:    每个input_section_attr必须跟随在“+”后;且大小写不敏感;
                        RO-CODE 或 CODE
                        RO-DATA 或 CONST
                        RO或TEXT, 包括 RO-CODE 和 RO-DATA
                        RW-DATA
                        RW-CODE
                        RW 或 DATA, 包括 RW-CODE 和 RW-DATA
                        ZI 或 BSS
                        ENTRY, that is a section containing an ENTRY point.
                        FIRST,用于指定存放在一个执行区域的第一个或最后一个区域;
                        LAST,同上;
input_section_pattern: 段名; 

sct 文件中主要包含描述加载域及执行域的部分,一个文件中可包含有多个加载域,而一个加载域可由多个部分的执行域组成。同等级的域之间使用花括号“{}”分隔开,最外层的是加载域,第二层“{}”内的是执行域。

我们还是以上次的sct文件为例:

加载域名: 在 map 文件中的描述会使用该名称LR_IROM1来标识空间。

• 基地址 + 地址偏移:基地址为 STM32 内部 FLASH 的基地址 0x08000000,地址偏移可选

• 属性列表: 属性列表说明了加载域的是否为绝对地址 N 字节对齐等属性

• 最大容量: 最大容量说明了这个加载域可使用的最大空间,STM32 内部 FLASH的大小0x00020000(128KB)

【执行域】执行域的格式与加载域是类似的,区别只是输入节区的描述有所不同。

包含了 ER_IROM1 及 RW_IRAM1两个执行域,它们分别对应描述了 STM32 的内部 FLASH及内部 SRAM 的基地址及空间大小。

而它们内部的“输入节区描述”说明了哪些节区要存储到这些空间,链接器会根据它来处理编排这些节区。

【输入节区描述】模块选择样式 “(“输入节区样式”,” “+“输入节区属性”)”

模块选择样式 “(“输入节区样式”,” “+“节区特性”)”

模块选择样式 “(“输入符号样式”,” “+“输入节区属性”)”

模块选择样式 “(“输入符号样式”,” “+“节区特性”)”

• 模块选择样式: 模块选择样式可用于选择 o 及 lib 目标文件作为输入节区,它可以直接使用目标文件名或“”通配符,也可以使用“.ANY”。使用语句“.o”可以选择所有 o 文件,使用“.lib”可以选择所有 lib 文件,使用“”或“.ANY”可以选择所有的 o 文件及 lib 文件。其中“.ANY”选择语句的优先级是最低的,所有其它选择语句选择完剩下的数据才会被“.ANY”语句选中。• 输入节区样式: 通过输入节区样式可以选择要控制的节区。“(RESET, +First)” 语句的 RESET 就是输入节区样式,它选择RESET 的节区,并使用后面介绍的节区特性控制字“+First”表示它要存储到本区域的第一个地址。

“(InRoot$$Sections)” 是一个链接器支持的特殊选择符号,它可以选择所有标准库里要求存储到 root 区域的节区。

• 输入符号样式: 可以选择要控制的符号,符号样式需要使用“:gdef:”来修饰。例如可以使用“*(:gdef:Value_Test)”来控制选择符号“Value_Test”。

• 输入节区属性: 通过在模块选择样式后面加入输入节区属性,可以选择样式中不同的内容,每个节区属性描述符前要写一个“+”号,使用空格或“,”号分隔开,可以使用的节区属性描述符见表属性描述符及其意义。

sct文件section属性.jpg



共1条 1/1 1 跳转至

回复

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