keil STM32中sct 分散加载文件学习

您所在的位置:网站首页 stm32分散加载程序 keil STM32中sct 分散加载文件学习

keil STM32中sct 分散加载文件学习

2024-07-14 10:48| 来源: 网络整理| 查看: 265

sct 分散加载文件简介

MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File,scatter loading),链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存储位置。

一、芯片选型

工程构建时, MDK 会根据我们选择的芯片型号,获知芯片的内部 FLASH 及内部SRAM 存储器概况。这里我选择的是STM32F407VET6型号, 这款单片机有高达 192+4 KB 的 SRAM,包括 64 KB 的 CCM(内核耦合存储器)数据 RAM以及512 字节的 ROM 内存。 这一点可以在官网看到。 STM32F407VE高性能基础系列,带 DSP 和 FPU 的 Arm Cortex-M4 内核,512 KB 闪存,168 MHz CPU。 在这里插入图片描述 在这里插入图片描述

二、.sct分散加载文件的格式

在keil中可以在linker中取消勾选Usw Menory Layout from Target Dialog,然后点击下方的编辑按键,就可以在keil中查看文件了。但是需要注意如果你需要自己去更改sct文件去自己分配地址空间,也需要取消勾选,不然keil会默认生成sct文件然后覆盖你写的文件。 在这里插入图片描述 sct 文件中主要包含描述加载域及执行域的部分,一个文件中可包含有多个加载域,而一个加载域可由多个部分的执行域组成。同等级的域之间使用花括号“{}”分隔开,最外层的是加载域(LR_IROM1),第二层“{}”内的是执行域 (ER_IROM1 RW_IRAM1 RW_IRAM2)

2-1 加载域

在这里插入图片描述

LR_IROM1 0x08000000 0x00080000 { ; load region size_region ...... }

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

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

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

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

2-2 执行域

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

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

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

三 输入节区描述

在这里插入图片描述

ER_IROM1 0x08000000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x10000000 0x00010000 { .ANY (+RW +ZI) }

• 模块选择样式: 模块选择样式可用于选择 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”。

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

在这里插入图片描述

这里我想说明一下要把RW-DATA数据放到RAM中,大家都应该知道RW-DATA叫做初值非零可读写的全局变量,存储的时候在ROM中。

SCT文件描述的是程序加载的时候,这时候RW-DATA要从ROM中复制到SRAM中。

在这里插入图片描述

四、控制文件分配到指定的存储空间

设定好存储器的信息后,可以控制各个源文件定制到哪个部分存储器。

在 MDK 的工程文件栏中,选中要配置的文件,右键,并在弹出的菜单中选择“Options for File xxxx”即可弹出一个文件配置对话框,在该对话框中进行存储器定制,见图使用右键打开文件配置并把它的 RW 区配置成使IRAM2。 在这里插入图片描述 在这里插入图片描述 类似地,设置某些文件的代码段被存储到特定的 ROM 中,

设置某些文件使用的ZI-data 或 RW-data 存储到外部 SRAM 中。 (控制 ZI-data 到外部 SRAM 时注意还需要修改启动文件设置堆栈对应的地址,原启动文件中的地址是指向内部 SRAM 的)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3