博主是个还没入门的弱菜,老师让查资料所以我把自己找的资料整理一下搁在这里方便以后查阅用的,自己并没有试过。

如有错误,欢迎指正。

参考资料:

首先介绍几个概念:

1.ARM映像文件

ARM映像文件是一个层次性结构的文件,其中包含了域(region)、输出段(output section)和输入段(input section)。各部分关系如下:

一个映像文件由一个或多个域组成

每个域包含一个或多个输出段

每个输出段包含一个或多个输入段

各输入段包含了目标文件中的代码和数据

输入段中包含了4类内容:代码、已经初始化的数据、未经初始化的存储区域、内容初始化成0的存储区域。每个输入段有相应的属性,可以为只读的(RO)、可读写的(RW)以及初始化成0的(ZI)。ARM连接器根据各输入段的属性将这些输入段分组,再组成不同的输出段以及域。

一个输出段中包含了一系列的具有相同的RO、RW和ZI属性的输入段。输出段的属性与其中包含的输入段的属性相同。在一个输出段内部,各输入段是按照一定的规则排序的,这个后面再补充。

一个域中包含了1~3个输出段,其中各输出段的属性各不相同。各输出段的排列顺序是由其属性决定的。其中,RO属性的输出段排在最前面,其次是RW属性的输出段,最后是ZI属性的输出段。一个域通常映射到一个物理存储器上,如ROM和RAM等。

2.ARM映像文件各组成部分的地址映射

分散加载机制允许为链接器指定映像的存储器映射信息,可实现对映像组件分组和布局的全面控制。分散加载通常仅用于具有复杂存储器映射的映像(尽管也可用于简单映像),也就是适合加载和执行时内存映射中的多个区是分散的情况。

要构建映像的存储器映射,链接器必须有:描述节如何分组成区的分组信息、描述映像区在存储器映射中的放置地址的放置信息。

分散加载区域分两类:

加载区:该映像文件开始运行前存放的区域,即当系统启动或加载时应用程序存放的区域。

执行区:映像文件运行时的区域,即系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。

3.分散加载文件(即scatter file,后缀为.scf)

分散加载文件是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。如果不用SCATTER文件指定,那么ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。

但在某些场合,我们希望把某些数据放在指定的地址处,那么这时候SCATTER文件就发挥了非常大的作用。而且SCATTER文件用起来非常简单好用。

举个例子:比如像LPC2378芯片具有多个不连续的SRAM,通用的RAM是32KB,可是32KB不够用,我想把某个.C中的RW数据放在USB的SRAM中,那么就可以通过SCATTER文件来完成这个功能。

分散加载文件的语法:

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, selects both RO-CODE and RO-DATA

RW-DATA

RW-CODE

RW 或 DATA, selects both RW-CODE and RW-DATA

ZI 或 BSS

ENTRY, that is a section containing an ENTRY point.

FIRST,用于指定存放在一个执行区域的第一个或最后一个区域;

LAST,同上;

input_section_pattern: 段名;

汇编中指定段:

AREA    vectors, CODE, READONLY

C中指定段:

#pragma arm section [sort_type[[=]"name"]] [,sort_type="name"]*

sort_type:      code、rwdata、rodata、zidata

如果“sort_type”指定了但没有指定“name”,那么之前的修改的段名将被恢复成默认值。

#pragma arm section     // 恢复所有段名为默认设置。

应用:

#pragma arm section rwdata = "SRAM",zidata = "SRAM"

static OS_STK  SecondTaskStk[256];              // “rwdata”“zidata”将定位在“sram”段中。

#pragma arm section                                 // 恢复默认设置

样例:

简单存储器映射实例

LOAD_ROM 0x0000 0x8000 //Name of load region, Start address for load region, Maximum size of load region{

EXEC_ROM0x0000 0x8000 //Name of first exec region, Start address for exec region, Maximum size of this region{*(+RO) //Place all code and RO data into this exec region

}

RAM0x10000 0x60000 //Start of second exec region{*(+RW, +ZI) //Place all RW and ZI data into this exec region

}

}

复杂存储器映射实例:

LOAD_ROM_1 0x0000 //Start address for first load region{

EXEC_ROM_10x0000 //Start address for first exec region{

program1.o (+RO) //Place all code and RO data from program1.o into this exec region

}

DRAM0x18000 0x8000 //Start address for this exec region Maximum size of this exec region{

program1.o (+RW, +ZI) //Place all RW and ZI data from program1.o into this exec region

}

}

LOAD_ROM_20x4000 //Start address for second load region{

EXEC_ROM_20x4000{

program2.o (+RO) //Place all code and RO data from program2.o into this exec region

}

SRAM0x8000 0x8000{

program2.o (+RW, +ZI) //Place all RW and ZI data from program2.o into this exec region

}

}

具体格式描述请参考资料: 分散加载描述文件

一个具体的例子:

; *************************************************************

; * Scatter-Loading Description File generated by uVision *

; *************************************************************LR_IROM10x00000000 0x00080000{ ; 第一个加载域,名字是LR_IROM1,起始地址0x00000000 大小是0x00080000

ER_IROM10x00000000 0x00080000 { ; 第一个运行时域,名字是ER_IROM1 起始地址0x00000000 大小事0x00080000*.o (RESET, +First) ; IAP第一阶段在FLASH中运行*(InRoot$$Sections) ; All library sections that must be in a root region

.ANY (+RO) ; .ANY与*功能相似,用.ANY可以把已经被指定的具有RW,ZI属性的数据排除

}

RW_IRAM10x10000000 0x00010000{ ; RW data

.ANY(+RW +ZI)

}

RW_SDRAM10xA0000000 0x00800000{ ; RW data

STARTUP_LPC177X_8X.o (HEAP) ;HEAP用来定位堆栈的底*.LIB(+RW +ZI)

}

}

keil的sct文件_Keil sct分散加载文件相关推荐

  1. keil的sct文件_STM32 分散加载文件 .sct 解析

    1.STM32 启动文件与 .sct 文件分析 1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K; 2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K; ...

  2. KEIL MDK链接脚本-分散加载文件sct

    在了解keil的链接脚本之前需要了解几个重要概念: RO(ReadOnly):表示程序中的指令和常量 RW(Read/Write):表示程序中已初始化的变量 ZI(Zero):表示程序中未初始化的变量 ...

  3. 【C语言常识】Keil MDK的分散加载文件.sct

    https://blog.csdn.net/wuhenyouyuyouyu/article/details/71171546?ops_request_misc=%257B%2522request%25 ...

  4. keil分散加载文件sct写法

    //-------------------------------------------------------------------------------------------------- ...

  5. 【IoT】STM32 分散加载文件 .sct 解析

    1.STM32 启动文件与 .sct 文件分析 1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K; 2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K; ...

  6. H750移植rt_thread操作系统完整工程分享,包括外部FLASH分散加载文件

    一.移植注意事项 1.在运行外部FLASH存储的代码之前首先要初始化QSPI进入内存映射模式,参考代码: //QSPI进入内存映射模式(执行QSPI代码必备前提,为了减少引入的文件, //除了GPIO ...

  7. app与bootloader共享内存的方法(分散加载文件)

    app要升级时要通知bootloader,然后进入bootloader模式,app要如何通知bootloader呢?以前用了写入升级标志到eeprom的方式,然后bootloader再去读取,这是一种 ...

  8. KEIl工具之scatter file分散加载文件1

    KEIl工具之scatter file分散加载文件 转自:http://blog.csdn.net/zhoujiaxq/article/details/8102587 **************** ...

  9. KEIL的分散加载文件

    KEIL的分散加载文件 使用分散文件指定栈和堆 创建root执行区 使用 FIXED 属性创建根区域 在特定地址放置函数和数据 使用分散加载显式放置命名部分 使用.ANY模块选择器放置未分配的段 使用 ...

最新文章

  1. 2021版Java知识体系详解!(赠视频)
  2. 译 | 缓存穿透问题导致Facebook史上最严重事故之一
  3. TNS-12518 Linux Error:32:Broken pipe
  4. 信息检索Information Retrieval评价指标
  5. windows phone 操作 http异步返回结果
  6. 【机器视觉】 dev_error_var算子
  7. Android系统Recovery工作原理之使用update.zip升级过程分析(二)---u...
  8. c++builder tadoquery存储过程_Electron桌面应用程序从创建项目、启动项目到打包程序的详细过程...
  9. zabbix (二)安装
  10. 【算法学习】【图像增强】基于拉普拉斯算子的图像锐化
  11. LINUX用C判断文件是否存在
  12. 诸神战纪堕落天使java_诸神战纪-堕落天使路西法
  13. react customize-cra 配置less modules
  14. 学习笔记之——针孔相机模型及单应性矩阵
  15. 淘淘商城第75讲——添加商品同步到索引库以及消息机制测试
  16. Netty游戏服务器实战开发(11):Spring+mybatis 手写分库分表策略(续)
  17. Conda更新或安装包时出现Verifying transaction: failed+RemoveError的解决方法
  18. PCFG句法分析之CYK算法
  19. pubg体验服服务器维护,简单1招,教你快速获得《Pubg Mobile》体验服“邀请码”!...
  20. Nginx根据url并切割url进行路由转发

热门文章

  1. a.gray.Bulimia.a病毒
  2. Windows磁盘管理工具Diskpart之二 管理动态磁盘
  3. 歌尔2718硅咪 超小体积 S15OB383-058 S15OB381-055 S15OT421-001
  4. php快速计算子网掩码的前缀长度
  5. LDO线性稳压器详解
  6. 这5款堪称神器的插件,能让你的效率提升3-4倍!还不知有点遗憾
  7. OSChina 周六乱弹 ——清明节你怎么过的这么开心?
  8. 洛谷P5613 黑蚊子多
  9. 丢手帕问题 java_java入门小程序—17人游戏(丢手绢问题) | 学步园
  10. 常见js手撕题及算法总结