Keil MDK的sct分散加载文件详解

这篇具有很好参考价值的文章主要介绍了Keil MDK的sct分散加载文件详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

sct 分散加载文件简介

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

工程构建时, MDK 会根据我们选择的芯片型号,获知芯片的内部 FLASH 及内部SRAM 存储器概况。这里我选择的是STM32F103VET6型号, 这款单片机有 64 KB 的 SRAM,512 KB的 ROM 内存,可以通过规格书查到。
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
当选好型号后,Target页面的ROM和RAM设置就已经按默认的自动配置好了。
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
ROM size为0x80000即512k字节,RAM size为0x10000即64k字节,与规格书一致。

默认情况下,Linker页面的Usw Menory Layout from Target Dialog是勾选上的,意思是以前面Target页面的内存布局为准。可以看到下图中的Scatter File是没有文件的,因为这时候内存布局是依靠前面Target页面设置为准,这里有没有这个分散加载文件无所谓。
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
现在这样操作可以让KEIL自动生成一个sct文件:
1.去掉勾选Usw Menory Layout from Target Dialog,这时Scatter File自动生成一个sct文件在obj文件的输出路径下
2.重新勾选Usw Menory Layout from Target Dialog,编译工程
3.编译成功后就生成了一个默认的sct文件,其配置与Target页面的内存布局含义一样,再回到Options->Linker就可以点击Edit打开该sct文件

打开后如下图所示:
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
如果把其与之前的Target页面的内存布局来对比,不难理解这里面几个数字表示的含义。
其按每行对应的含义如下:

加载域名  起始地址 大小{;加载区域大小 (分号后面是注释)
        运行域名 起始地址 大小   ;执行地址
        {
                中断向量表起始地址, +First表示强制放到首地址

                ARM相关库,InRoot$$Sections即ARM库的链接器标号,主要作用COPY RW区到RAM,
                然后再RW区后面创建ZI区。 库函数__main函数中有这个段。 它是__main()的一部分。

                编译文件RO只读在该区域
        }
        运行内存名字 起始地址 大小
        {
                编译可读可写,静态区
        }
}

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

keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
选中某个文件,右键选第一个选项
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
打开对应文件的设置项,其中有Memory Assignment项,三个设置分别对应RO ZI RW数据放在内存哪个位置。
+RO表示只读,代码或者只读数据,一般用来表示代码,+RW表示可读可写的数据,+ZI表示初始化为0的数据。
举例:
如果我在led.c文件的设置项里设置Other Data放到IRAM1
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
重新编译后再打开工程的sct文件就会看到已经同步更新了,在RW_IRAM1执行域里多了一句led.o (+RW)
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件

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 文件中主要包含描述加载域及执行域的部分,一个文件中可包含有多个加载域,而一个加载域可由多个部分的执行域组成。同等级的域之间使用花括号“{}”分隔开,最外层的是加载域,第二层“{}”内的是执行域。
还是举之前的例子:

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

【加载域】
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件
• 加载域名: 在 map 文件中的描述会使用该名称LR_IROM1来标识空间。

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

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

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

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

包含了 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”。

• 输入节区属性: 通过在模块选择样式后面加入输入节区属性,可以选择样式中不同的内容,每个节区属性描述符前要写一个“+”号,使用空格或“,”号分隔开,可以使用的节区属性描述符见表属性描述符及其意义。
keil软件的sct文件,STM32进阶-疑难问题录,单片机,stm32,嵌入式硬件

sct文件范例

范例1:
通过分散加载文件把代码从flash里拷贝到ram里运行, 基于LPC1788。

LR_IROM1 0x00000000 0x00002000  
{ 
	ER_IROM1 0x00000000 0x00020000  
	{
		*.o (RESET, +First)
		*(InRoot$$Sections)
		startup_lpc177x_8x.o (+RO)
		system_LPC177x_8x.o (+RO)
	}
	
	RW_IRAM1 0x20000000 0x00004000  
	{
		.ANY (+RW +ZI)
	}
}
 
LR_IROM2 0x00002000	0x0007E000
{
	VECTOR 0x10000000 EMPTY 0xE4
	{
	}
	
	ER_IRAM1 +0
	{
		.ANY (+RO)
	}
}

这里有两个加载域(load region)LR_IROM1和LR_IROM2,LR_IROM1是初始化程序,拷贝代码等,从ROM的地址0开始,LR_ROM2是应用程序,从ROM的0x2000开始。+RO表示只读,代码或者只读数据,一般用来表示代码,+RW表示可读可写的数据,+ZI表示初始化为0的数据。大括号里面的为运行域(execution region),一个加载域可以包含几个运行域,LR_ROM2里面有两个运行域,VECTOR和ER_IRAM1,我用VECTOR来表示中断向量区域,ER_IRAM1来表示应用程序区,+0表示紧接着VECTOR排放,EMPTY表示空的,这里空出0xE4的大小,用来放中断向量,.ANY表示除了上面用到的代码之外的代码,官网上有专门解释.ANY的一节。

范例2:
下面是针对LPC2378的USB SRAM作数据RAM使用的配置:

;******************************************************************************
;
; SCATTER LOADING DEION
; ARM
; KEIL's uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : LPC2378_Flash.scat
;******************************************************************************

LR_IROM1 0x00000000 0x00080000 ;第一个加载域,名字为LR_IROM1,起始
{                  ;地址为0x0,大小为0x80000
	ER_IROM1 0x00000000 0x00080000 ;加载域中的运行时域,名字为ER_IROM1
	{ ;; 起始地址为0x0,大小为0x80000
		vectors.o (VECT, +First)
		init.o (INIT)
		* (+RO)
	}

	RW_IRAM1 0x40000000 0x0000e800
	{
		.ANY(+RW,+ZI)     ; 此处.ANY替换原来的*,是因为下面的一个执行域对指定的模块中的RW,ZI数据指定了存放地址
		;.ANY就可以把已经被指定的具有RW,ZI属性的数据排除
	} ; The following declarations select the "two region model" ;
}

https://blog.csdn.net/weixin_45829708/article/details/124562053

https://blog.csdn.net/wuhenyouyuyouyu/article/details/71171546文章来源地址https://www.toymoban.com/news/detail-783746.html

到了这里,关于Keil MDK的sct分散加载文件详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 keil MDK配置FPU详解

    记录下keil对FPU的配置,及对应的宏参数。 FPU单元是芯片上一个独立于CPU处理的浮点运算单元,整个单元可以被使能和关闭。 STM32F4带有32位单精度硬件FPU支持浮点指令集。相比Cortex-M3、Cortex-M0等无FPU的芯片高出数十倍甚至上百倍的运算性能。 STM32F7/H7及以上处理器带有双精度

    2024年02月11日
    浏览(39)
  • MDK keil5新建STM32工程文件--实践篇

    一、先下载芯片支持包 第一步 :当然是先百度搜索我们的keil官网(网址):https://www.keil.com/   第二步 :点击首页的Project,会跳转如界面,再次点击Arm Cortex-M,如图所示:    第三步 :点击后会再次跳转,这时候我们再次点击Public Software Packs,如图所示: 第四步 :点击后

    2024年02月16日
    浏览(54)
  • 【STM32】keil MDK-Arm 5.38 功能详解

    keil 是ARM的软件子公司, MDK-Arm 是keil的一个产品,把它称作keil也是可以的。 arm 链接:https://developer.arm.com/Tools%20and%20Software/Keil%20MDK#Overview keil:https://www.keil.com/download/ keil MDK是一个完整的软件开发解决方案,用于创建,构建和调试基于Arm的微控制器的嵌入式应用程序。keil

    2024年02月11日
    浏览(137)
  • keil MDK软件配置介绍与仿VSCode主题分享

    Keil MDK的默认配置是不方便使用的,包括编码方式,缩进,Tab键,自动保存,界面主题,自动补全等,都需要清楚怎么根据个人使用习惯进行配置。 本文对Keil的各个配置选项进行了较详细的说明,并分享了三款仿VSCode的界面主题以改善在Keil中编码的糟糕体验。 此部分内容参

    2024年02月04日
    浏览(36)
  • keil官网下载MDK的STM32芯片pack包

    背景         最近重装了电脑系统,重新安装了MDK所以导致MDK芯片包需要重新下载,软件内下载又太慢,所以趁现在找到了官网下载方法把方法分享出来供大家参考。 1、在浏览器中输入网址:www.keil.arm.com进入如下界面,然后点击:Hardware -Devices 2、在Devices中选择,在红色方框

    2024年02月13日
    浏览(51)
  • Keil MDK编程环境下的 STM32 IAP下载(学习笔记)

    ICP ICP(In Circuit Programing)。在电路编程,可通过 CPU 的 Debug Access Port 烧录代码,比如 ARM Cortex 的 Debug Interface 主要是 SWD(Serial Wire Debug) 或 JTAG(Joint Test Action Group); ISP ISP(In System Programing)。在系统编程,可借助 MCU 厂商预置的 Bootloader 实现通过板载 UART 或 USB 接口烧录代码,比如

    2024年02月06日
    浏览(38)
  • Keil MDK-ARM 软件的部分常用快捷键如下

    F7 :编译。 F8:  下载。 F9:添加/取消断点。 Ctrl + F5:调试。 Tab:将选中的内容整体右移。 Shift + Tab:将选中的内容整体左移。 Home:将光标移至行首。 End:将光标移至行末。 Ctrl + :光标从当前位置右移一个单词。 此外,还有其他一些快捷键,可以通过在Keil软件的菜单栏

    2024年02月09日
    浏览(45)
  • 如何从官网下载 KEIL MDK5 软件 ARM 开发?

    KEIL MDK5 是一款广泛用于 ARM 微控制器开发的集成开发环境(IDE)。如果您希望开始使用 KEIL MDK5 进行 ARM 开发,可以按照以下步骤从官网下载并安装该软件。 打开您的网络浏览器,并前往 KEIL 官方网站。您可以通过在搜索引擎中输入 “KEIL MDK5 官网” 来找到官方网站。 在 KE

    2024年03月19日
    浏览(60)
  • keil5软件安装&开发环境搭建教程(mdk,c51通用)

    这是我在csdn上写的第一篇文章,心情激动兴奋。因为之前都是看别人写的博客,从来没想过自己去写一篇,在学长的鼓励下,尝试完成人生第一篇博客。仍有不足,希望大佬多多指正! 写这篇的目的是因为keil5的安装是许多人入门嵌入式的第一步,而且以后遇到许多不知名的

    2024年02月05日
    浏览(52)
  • 【正点原子STM32】STM32初体验(Keil MDK工具下载使用、DAP仿真器、MDK上配置DAP、Debug)

    一、MDK5编译例程 二、串口下载程序 2.1、串口下载程序须知 2.2、串口下载硬件连接 2.3、配置下载工具 (ATK-XISP.exe) 2.4、STM32启动模式(M3和M4) 三、DAP下载程序 3.1、DAP下载硬件连接 3.2、在MDK上配置DAP 不同开发板的下载算法有所不同 Build构建 F7、Download下载 F8 四、DAP调试程序 4.

    2024年02月20日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包