打印
[STM32L4]

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

[复制链接]
2254|68
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sct 分散加载文件简介MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File,scatter loading),链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存储位置。

使用特权

评论回复
沙发
雨果喝水|  楼主 | 2022-8-25 16:31 | 只看该作者
一、芯片选型
工程构建时, 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。

使用特权

评论回复
板凳
雨果喝水|  楼主 | 2022-8-25 16:32 | 只看该作者

使用特权

评论回复
地板
雨果喝水|  楼主 | 2022-8-25 16:33 | 只看该作者

使用特权

评论回复
5
雨果喝水|  楼主 | 2022-8-25 16:40 | 只看该作者
二、.sct分散加载文件的格式
在keil中可以在linker中取消勾选Usw Menory Layout from Target Dialog,然后点击下方的编辑按键,就可以在keil中查看文件了。但是需要注意如果你需要自己去更改sct文件去自己分配地址空间,也需要取消勾选,不然keil会默认生成sct文件然后覆盖你写的文件。

使用特权

评论回复
6
雨果喝水|  楼主 | 2022-8-25 16:41 | 只看该作者
二、.sct分散加载文件的格式
在keil中可以在linker中取消勾选Usw Menory Layout from Target Dialog,然后点击下方的编辑按键,就可以在keil中查看文件了。但是需要注意如果你需要自己去更改sct文件去自己分配地址空间,也需要取消勾选,不然keil会默认生成sct文件然后覆盖你写的文件。


使用特权

评论回复
7
雨果喝水|  楼主 | 2022-8-25 16:45 | 只看该作者
二、.sct分散加载文件的格式
在keil中可以在linker中取消勾选Usw Menory Layout from Target Dialog,然后点击下方的编辑按键,就可以在keil中查看文件了。但是需要注意如果你需要自己去更改sct文件去自己分配地址空间,也需要取消勾选,不然keil会默认生成sct文件然后覆盖你写的文件。

使用特权

评论回复
8
雨果喝水|  楼主 | 2022-8-25 16:47 | 只看该作者

使用特权

评论回复
9
雨果喝水|  楼主 | 2022-8-25 16:48 | 只看该作者

使用特权

评论回复
10
雨果喝水|  楼主 | 2022-8-25 17:36 | 只看该作者
sct 文件中主要包含描述加载域及执行域的部分,一个文件中可包含有多个加载域,而一个加载域可由多个部分的执行域组成。同等级的域之间使用花括号“{}”分隔开,最外层的是加载域(LR_IROM1),第二层“{}”内的是执行域 (ER_IROM1 RW_IRAM1 RW_IRAM2)

使用特权

评论回复
11
雨果喝水|  楼主 | 2022-8-25 17:37 | 只看该作者
2-1 加载域

使用特权

评论回复
12
雨果喝水|  楼主 | 2022-8-25 17:39 | 只看该作者
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
......
}

使用特权

评论回复
13
雨果喝水|  楼主 | 2022-8-25 17:40 | 只看该作者
加载域名: 在 map 文件中的描述会使用该名称LR_IROM1来标识空间。
• 基地址 + 地址偏移: 基地址为 STM32 内部 FLASH 的基地址 0x08000000,地址偏移可选
• 属性列表: 属性列表说明了加载域的是否为绝对地址 N 字节对齐等属性
• 最大容量: 最大容量说明了这个加载域可使用的最大空间,STM32 内部 FLASH的大小0x00080000(512KB)

使用特权

评论回复
14
雨果喝水|  楼主 | 2022-8-25 17:42 | 只看该作者
2-2 执行域
执行域的格式与加载域是类似的,区别只是输入节区的描述有所不同。
包含了 ER_IROM1 及 RW_IRAM1及 RW_IRAM2三个执行域,它们分别对应描述了 STM32 的内部 FLASH及内部 SRAM 的基地址及空间大小。
而它们内部的“输入节区描述”说明了哪些节区要存储到这些空间,链接器会根据它来处理编排这些节区。

使用特权

评论回复
15
雨果喝水|  楼主 | 2022-8-25 17:43 | 只看该作者
三 输入节区描述

使用特权

评论回复
16
雨果喝水|  楼主 | 2022-8-25 17:44 | 只看该作者
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)
  }

使用特权

评论回复
17
雨果喝水|  楼主 | 2022-8-25 17:45 | 只看该作者
11
• 模块选择样式: 模块选择样式可用于选择 o 及 lib 目标文件作为输入节区,它可以直接使用目标文件名或“”通配符,也可以使用“.ANY”。 使用语句“.o”可以选择所有 o 文件,使用“.lib”可以选择所有 lib 文件,使用“”或“.ANY”可以选择所有的 o 文件及 lib 文件。 其中“.ANY”选择语句的优先级是最低的,所有其它选择语句选择完剩下的数据才会被“.ANY”语句选中。

使用特权

评论回复
18
雨果喝水|  楼主 | 2022-8-25 17:46 | 只看该作者
输入节区样式: 通过输入节区样式可以选择要控制的节区。“(RESET, +First)” 语句的 RESET 就是输入节区样式,它选择RESET 的节区,并使用后面介绍的节区特性控制字“+First”表示它要存储到本区域的第一个地址。
“(InRoot$$Sections)” 是一个链接器支持的特殊选择符号,它可以选择所有标准库里要求存储到 root 区域的节区。

使用特权

评论回复
19
雨果喝水|  楼主 | 2022-8-25 17:47 | 只看该作者
输入符号样式: 可以选择要控制的符号,符号样式需要使用“:gdef:”来修饰。例如可以使用“*(:gdef:Value_Test)”来控制选择符号“Value_Test”。

使用特权

评论回复
20
雨果喝水|  楼主 | 2022-8-25 17:51 | 只看该作者
输入节区属性: 通过在模块选择样式后面加入输入节区属性,可以选择样式中不同的内容,每个节区属性描述符前要写一个“+”号,使用空格或“,”号分隔开,可以使用的节区属性描述符见表属性描述符及其意义。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

1153

帖子

0

粉丝