分散加载描述文件
分散加载文件浅释
销售:
电话:(020)22644249 22644399 22644372 22644261 28872524 28872342 28872349 28872569 28872573 38601786
维修:
电话:(020)22644245
产品应用笔记
在 Keil/ADS/IAR 等编译工具中,可通过分散加载机制实现。分散加载通过配置文件实 现,这样的文件称为分散加载文件。本文重点介绍 Keil 的分散加载文件配置。
工程技术笔记
©2008 Guangzhou ZHIYUAN Electronics CO., LTD. 1
广州周立功单片机发展有限公司
2.2
变量完成初始化的地方........................................................................................... 2
2.3
ZI-Data 变量初始化方式......................................................................................... 3
日期 2011/10/24
分散加载文件浅释
ARM 嵌入式开发
原因 创建文档
产品应用笔记
©2008 Guangzhou ZLGMCU Development Co., LTD. i
广州周立功单片机发展有限公司
分散加载文件浅释
ARM 嵌入式开发
销售与服务网络(一)
广州周立功单片机发展有限公司
地址:广州市天河北路 689 号光大银行大厦 12 楼 F4 邮编:510630 电话:(020)38730916 38730917 38730972 38730976 38730977 传真:(020)38730925 网址:
Keil分散文件加载
Keil分散文件加载分散加载能够将加载和运行时存储器中的代码和数据描述在被称为分散加载描述文件的一个文本描述文件中,以供连接时使用。
(1)分散加载区分散加载区域分为两类:? 加载区,包含应用程序复位和加载时的代码和数据。
? 执行区,包含应用程序执行时的代码和数据。
应用程序启动过程中,从每个加载区可创建一个或多个执行区。
映象中所有的代码和数据准确地分为一个加载区和一个执行区。
(2)分散加载文件示例ROM_LOAD 0x0000 0x4000{ROM_EXEC 0x0000 0x4000; Root region{* (+RO); All code and constant data}RAM 0x10000 0x8000{* (+RW, +ZI); All non-constant data}}(3)分散加载文件语法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”)匹配所有目标文件和库。
分散加载文件的作用
分散加载文件的作用作用分散加载文件的作用前言在当今互联网时代,网络速度和用户体验成为了网站开发者和设计师们关注的焦点。
为了提升网站加载速度和用户体验,分散加载文件成为了一个常见的解决方案。
本文将探讨分散加载文件的作用及其在网站开发和设计中的应用。
一、定义分散加载文件是指将一个由多个组件构成的文件拆分为多个部分分别加载,达到优化网站性能和加快加载速度的目的。
该方法有效缩短了用户等待页面加载的时间,提供更好的用户体验。
二、作用1. 优化页面加载速度当一个网页文件过大时,浏览器需要较长时间来加载和渲染整个页面。
而将文件分散加载可以减小每个文件的体积,从而缩短了整个网页的加载时间。
这对于用户来说,能够更快地打开网页,减少等待时间,提高用户满意度和留存率。
2. 提高网站性能分散加载文件能够在一定程度上减轻服务器的负载压力。
由于文件被分开加载,服务器可以并行处理这些文件的请求,从而提高网站的整体性能和稳定性。
此外,更有效的利用了服务器的带宽,使网站对大量用户的访问依然能够保持较高的加载速度和稳定性。
3. 便于维护和更新当一个文件被拆分为多个部分时,每个部分可以独立进行维护和更新。
这为开发者和设计师们带来了便利。
比如,当需要更新一个网页的某个组件时,只需替换相应的部分文件,而无需重新加载整个文件。
这样不仅加快了更新速度,也减少了可能带来的错误和破坏性影响。
4. 提高网站的可扩展性采用分散加载文件的方法,在网站需要扩展时更为便捷。
开发人员可以只添加新的文件,而不需要对现有的文件进行修改。
这样可以将扩展过程与现有代码相互独立,减少了开发的风险和复杂度。
5. 优化搜索引擎排名网站加载速度是影响搜索引擎排名的重要因素之一。
通过采用分散加载文件的方法,网站可以提供更快的加载速度,从而提升在搜索引擎中的排名。
这对于网站的流量和曝光量都有积极的影响。
三、案例分析下面以一个常见的案例来说明分散加载文件的具体应用。
假设一个电子商务网站,该网站的主页由多个组件构成,包括导航栏、轮播图、商品列表等。
Scatter分散加载文件详解
program1.o(+RO)
}
DRAM 0x18000 0x8000
{
program1.o (+RW, +ZI)
}
}
LOAD_ROM_2 0x4000
{
EXEC_ROM_2 0x4000
{
三、scatter file 实例
1 简单的内存映射
LOAD_ROM 0x0000 0x8000
{
EXEC_ROM 0x0000 0x8000
{
*(+RO)
}
RAM 0x10000 0x6000
{
*(+RW, +ZI)
base_address: 本区域内部目标被连接到的地址(按字对齐)。
+offset: 相对前一个下载区域的偏移量(4的整数倍,如果为第一个区域)。
2.2.2 执行区描述
每个执行区有:
名称: 供连接器确定不同下载区域
基地址: 相对或绝对地址
属性: 确定执行区域的属性
program2.o(+RO)
}
SRAM 0x8000 0x8000
{
program2.o (+RW, +ZI)
}
}
详解:
LOAD_ROM_1 0x0000(下载区域一起始地址)
{
EXEC_ROM_1 0x0000(第一执行区域开始地址)
内容:
块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。
一个加载块(加载时域)必须至少含有一个执行块(运行时域);实践中通常有多个执行块。
scatter file--ARM中的RO、RW和ZI DATA说明
一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。
要了解RO,RW和ZI需要首先了解以下知识:ARM程序的组成此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。
一个ARM程序包含3部分:RO,RW和ZIRO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的未初始化的变量由以上3点说明可以理解为:RO就是readonly,RW就是read/write,ZI就是zeroARM映像文件的组成所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。
以下用Image文件来称呼它。
Image文件包含了RO和RW数据。
之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。
包含进去反而浪费存储空间。
Q:为什么Image中必须包含RO和RW?A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。
ARM程序的执行过程从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM 程序之间并不是完全一样的。
因此就有必要了解ARM程序是如何从ROM 中的image到达实际运行状态的。
实际上,RO中的指令至少应该有这样的功能:1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。
ZI中也是变量,同理:变量不能存在ROM中在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。
keil 4 目标工具选项详解
Keil µVision 4 目标工具选项详解一、目标工具选项(Target Options …)µVision可以设置目标硬件的选项。
通过下图1中的工具栏2区域按钮或1区域菜单项Project -> Options for Target打开Options for Target对话框。
二、设备选项卡(device )在 Target页中设置目标硬件及所选CPU片上组件的参数。
如图2所示。
图2在图2中,各区域说明如下:1:显示当前选定的CPU的厂商名,CPU的型号,和编译工具。
2:是该cpu 的一些描述。
3:更改所使用的CPU,三、硬件目标设置选项卡(Target),见图3 所示。
图3在图3中,各区或详细说明如下:1:指定用晶振频率,可以用于模拟调试,仅反映外部振荡频率。
2:可以选择KEIL集成的实时操作系统RTX Kernel。
针对复杂的嵌入式应用,MDK内部集成了由ARM开发的实时操作系统(RTOS)内核RTX,它可以帮助用户解决多时序安排、任务调度、定时等工作。
值得一提的是,RTX可以无缝集成到MDK工具中,是一款需要授权的、无版税的RTOS。
RTX程序采用标准C语言编写,由RVCT编译器进行编译。
4:片外ROM设置,最多支持3块ROM(Flash),在Start栏输入起始地址,在Size栏输入大小。
若是有多片片外ROM,需要在7区域设置一个作为启动存储块,程序从该块启动;有几块ROM需要选中对应的3区域。
6:片内ROM设置。
设置方法同片外ROM,只是程序的存储区在芯片内集成。
9:使用 Cross-Module优化。
10:使用MicroLib库。
它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用. 这些应用程序不在操作系统中运行. MicroLib进行了高度优化以使代码变得很小. 它的功能比缺省 C 库少,并且根本不具备某些 ISOC 特性. 某些库函数的运行速度也比较慢,例如,memcpy(). 与缺省 C 库之间的差异MicroLib与缺省 C 库之间的主要差异是: MicroLib不符合 ISO C 库标准. 不支持某些 ISO 特性, 并且其他特性具有的功能也较少.MicroLib不符合 IEEE 754 二进制浮点算法标准. MicroLib进行了高度优化以使代码变得很小. 无法对区域设置进行配置. 缺省 C 区域设置是唯一可用的区域设置. 不能将 main() 声明为使用参数,并且不能返回内容. 不支持 stdio,但未缓冲的 stdin,stdout 和 stderr 除外. MicroLib对 C99 函数提供有限的支持. MicroLib不支持操作系统函数. MicroLib不支持与位置无关的代码. MicroLib不提供互斥锁来防止非线程安全的代码.MicroLib不支持宽字符或多字节字符串. 与 stdlib 不同, MicroLib不支持可选择的单或双区内存模型. MicroLib只提供双区内存模型,即单独的堆栈和堆区. 可以合理地将MicroLib与 --fpmode=std 或 --fpmode=fast 配合使用. MicroLib中的函数负责: 创建一个可在其中执行 C 程序的环境.这包括: 创建一个堆栈创建一个堆(如果需要) 初始化程序所用的库的部分组成内容.11:指令集中也分为高字节结尾,大端模式。
STM32 分散加载文件
STM32 分散加载文件 IAP —MDK(2011-07-25 14:42:30); *************************************************************; *** Scatter-Loading Description File generated by uVision ***; *************************************************************LR_IROM1 0x08000000 0x00004000 ; load region size_region 第一个加载域,起始地址0x08000000,{ 大小0x00004000ER_IROM1 0x08000000 0x00004000 ; load address = execution address 第一个运行时域, { 起始0x08000000,大小0x00004000*.o (RESET, +First) IAP第一阶段还是在FLASH中运行*(InRoot$$Sections)startup_stm32f10x_md.o}ER_IROM2 0x20008000 0x00004000 ; load address = execution address第二个运行时域, { 起始0x20008000,大小0x00004000.ANY (+RO) IAP第二阶段加载到SDRAM中运行}RW_IRAM1 0x20000000 0x00008000 ; RW data 把可读写的数据和初始化为0的数据放在内存SDRAM的开头{.ANY (+RW +ZI)}}做个比喻:就像一列火车在起始地址0x08000000装上大小0x00004000的货物,然后把特定的货物送到指定的地方拿下来运行或者存放。
上面这辆火车就停了3个地方。
编译时出现一下警告:warning: L6314W: No section matches pattern address(RO).在Target中的Linker中有一栏Misc controls,键入--diag_suppress=L6314即可,如下--diag_suppress taglist禁用所有具有指定标签的诊断消息。
[M3_SN] ARM分散加载原理
ARM分散加载原理摘要从ARM ELF目标文件主要构成出发,详细介绍了分散加载的基本原理、分散加载文件的语法、分散加载时连接器生成的预定义符号及要重新实现的函数等;以定位目标外设和定义超大型结构体数组两项应用案例加以说明,并给出完整的工程实例和Bootloader代码。
这些都已经在实际工程中多次应用和验证,是笔者实际工程的萃取。
关键词分散加载嵌入式系统Scatter Loading Bootloader ARM ELF引言在当今的嵌入式系统设计中,ARM处理器以价格便宜、功耗低、集成度高、外设资源丰富和易于使用的特点而得到广泛的应用;在速度和性能方面已达到或超过了部分PC104嵌入式计算机的性能,而成本却比相应的PC104计算机低很多,广泛应用于手机、GPS接收机、地图导航、路由器、以太网交换机及其他民用和工业电子设备。
在一个采用ARM处理器的实时嵌入式系统中,目标硬件常常由Flash、SRAM、SDRAM 和NVRAM(非易失性RAM)等存储器组成,并定位于不同的物理地址范围,那么,怎样通过软件更好地访问和利用这些不同的存储器并让系统高效地运行?分散加载(Scatter loading)就提供了这样一种机制。
它可以将内存变量定位于不同的物理地址上的存储器或端口,通过访问内存变量即可达到访问外部存储器或外设的目的;同时通过分撒加载,让大多数程序代码在高速的内部RAM中运行,从而使得系统的实时性大大增强。
1.ARM ELF目标文件的主要构成ARM ELF(Executable and Linking Format)目标文件主要由.Text段、.Data段、.BSS段构成,其他段如.debug段、.comment段等与本文关系部大,不作介绍。
.Text 段由可执行代码组成,段类型为Code,属性为RO;.Data 段由已初始化数据组成,段类型为Data, 属性为RO;.BSS 段由未初始化数据组成,段类型为Zero, 属性为RW,在应用个程序启动时对该段的数据初始化为零。
ARM分散加载文件
ARM分散加载文件(一)原理ARM 的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件(.scf 文件)中指定的存储器分配方案,将可执行镜像文件分成指定的分区并定位于指定的存储器物理地址。
这样,当嵌入式系统在复位或重新上电时,在对CPU 相应寄存器进行初始化后,首先执行ROM 存储器的Bootloader 代码,根据连接时的存储器分配方案,将相应代码和数据由加载地址拷贝到运行地址,这样,定位在RAM 存储器的代码和数据就在RAM 存储器中运行,而不再从ROM 存储器中取数据或取指令,从而大大提高了CPU 的运行速率和效率。
(二)结构Scatlertoading 的存储区块可以分成二种类型:装载区:当系统启动或加载时应用程序的存放区。
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。
(三)分散加载时连接器生成的预定义符号在编译连接时如果指定了分散加载文件(.scf 文件),在连接后会自动生成如下变量:(四)具体例子说明;ROM_LOAD 为加载区的名称,其后面的0x00000000 表示加载区的起始地址(存放程序代码的起始地址)ROM_LOAD 0x0{;ROM_EXEC 描述了执行区的地址,放在第一块位置定义ROM_EXEC 0x00000000 {;从起始地址开始放置向量表(即Startup.o(vectors, +First),其中Startup.o 为Startup.s 的目标文件) ;+First 表示Vector 段放在最前面;AREAvectors, CODE, READONLY Startup.o (vectors, +First);接着放置其。
NXP LPC ARM 必须知道的知识
NXP LPC ARM 必须知道的知识寄存器和工作模式:7种工作模式:fiq/irq/abt/und/sys/usr/svc。
通过"MSR cpsr_c,#0xdx"切换。
上电时进入svc模式。
svc和usr的区别是:svc可以通过"MSR cpsr_c,#0xdx"自由切换到其它任何模式,但是usr 不可以。
各模式下有自己的堆栈。
要在程序启动后依次进入各个模式分别设置自己的堆栈,最后进入usr模式。
好多个寄存器:r0 - r7 (a1 - a4 / v1 - v4),r15(pc) 在所有模式下都可见。
r8(v5),r9(sb,v6),r10(sl,v7),r11(fp,v8),r12(ip) fiq模式下有一组独立的映射。
r13(sp)/R14(lr) 在usr和sys模式下用同一组映射,其它模式下各有自己的映射。
cpsr在所有模式下可见。
spsr在usr和sys模式下没有映射。
cpsr是一个最特殊的寄存器,结构如下:31 30 29 28 27~8 7 6 5 4 3 2 1 0N Z C V 保留 I F T M4 M3 M2 M1 M0其中,N/Z/C/V分别为负/零/进位/溢出的标志位。
在所有模式下都可以进行读操作。
I/F为中断/快中断禁止位,M4~M0是工作模式控制位,它们在USR模式下都不可操作。
T为Thum/ARM模式位,在所有模式下不可直接操作,否则会天下大乱,预取址错误中断可以捕获这种乱局。
只能用BX指令进行Thum/ARM的状态切换。
总之,USR模式很不方便。
在该模式下只可以通过软中断控制I/F位。
cpsr只能够用MSR/MRS 指令来操作。
各工作模式下的spsr: 在由突发事件引起的模式切换发生时,新模式的spsr自动保存cpsr 的值,以备该模式退出时还原cpsr。
在程序的控制下进入某模式时,cpsr不会自动保存到相应的spsr。
ARM分散加载描述文件.scf的设置
片内16K RAM的顶端,存放不需要被"C libr ary"初始化的段。 注2
"+0"表示接着上一段"ERAM"的结尾,继续安 排存储区。 注3
在"Edit -> DebugRel Settings...->ARM Linker"中选中"Image map"。编译后在Error & Warnings窗口会显示出详细 的内存分配情况。如果在"List file name"中指定一个输出文件名,该祥单会直接存在制定文件中以供多次研究。
关于JTAG接口:
".scf"文件中的"+RW"对应".s"源文件中的"READWRITE". ".scf"文件中的"+ZI"对应".s"源文件中的"NOINIT". ".scf"文件中的"+RO"对应".s"源文件中的"READONLY".
在".s"源文件中有: AREA area_name CODE/DATA,READONLY/NOINIT/READWRITE END
注2: 在"Stack.o"里面会生成名为"Stacks"的段,段的属性为"NOINIT",该属性对应scf 文件中的"+ZI". 该段不需要初始化或者可以被初始化为"0".
mtk scatter编写规则
mtk scatter编写规则MTK Scatter编写规则MTK Scatter是一种用于编写手机ROM开发工具的规则文件,它是由MTK(联发科技)提供的一种用于分区和分散加载的配置文件。
本文将介绍MTK Scatter编写规则的相关内容,以帮助读者更好地理解和使用这一工具。
一、什么是MTK ScatterMTK Scatter是一种文本文件,用于描述Android手机的分区和分散加载信息。
在MTK平台上,手机的存储空间被分为不同的分区,每个分区都有自己的起始地址和大小。
MTK Scatter文件提供了这些分区的详细信息,包括分区名称、起始地址、大小等,以及用于加载ROM的相关信息。
二、MTK Scatter文件的基本结构MTK Scatter文件以XML格式编写,包含了一系列的标签和属性。
下面是一个简单的示例:```<?xml version="1.0" encoding="UTF-8"?><MTK_Scatter><Header></Header><Body><BootConfig></BootConfig><Partition></Partition><Download></Download></Body></MTK_Scatter>```MTK Scatter文件由三个主要部分组成:Header、Body和Partition。
Header部分用于描述文件的版本和作者等信息,Body 部分包含了BootConfig、Partition和Download等子标签,用于描述分区和加载信息。
三、分区信息的描述在MTK Scatter文件中,每个分区都用Partition标签来描述。
Partition标签包含了一系列的属性,如名称、文件名、起始地址、大小等。
ARM开发套件快速入门
NEUEBD-ARM开发套件快速入门ADS集成开发环境是ARM公司推出的ARM核微控制器集成开发工具,英文全称为ARM Developer Suite,成熟版本为ADS1.2。
ADS1.2支持ARM10之前的所有ARM系列微控制器,支持软件调试及JTAG硬件仿真调试,支持汇编、C、C++源程序,具有编译效率高、系统库功能强等特点,可以在Windows98、Windows XP、Windows2000以及RedHat Linux 上运行。
这里将简单介绍使用ADS1.2建立工程,编译连接设置,调试操作等等。
最后还介绍了基于LPC2103系列ARM7微控制器的工程模板的使用,EASYJTAG-H仿真器的安装与使用。
1.1 ADS 1.2集成开发环境的组成ADS 1.2由6个部分组成,如表1.1所示。
表1.1 ADS 1.2的组成部分名称描述使用方式代码生成工具ARM汇编器ARM的C、C++编译器Thumb的C、C++编译器ARM连接器由CodeWarrior IDE调用集成开发环境CodeWarrior IDE 工程管理,编译连接调试器AXDADW/ADUarmsd仿真调试指令模拟器ARMulator由AXD调用ARM开发包一些底层的例程实用程序(如fromELF)一些实用程序由CodeWarriorIDE调用ARM应用库C、C++函数库等用户程序使用由于用户一般直接操作的是CodeWarrior IDE集成开发环境和AXD调试器,所以这一章我们只介绍这两部分软件在Windows下的使用,其它部分的详细说明参考ADS 1.2的在线帮助文档或相关资料。
1.1.1 CodeWarriorIDE简介ADS 1.2使用了CodeWarrior IDE集成开发环境,并集成了ARM汇编器、ARM的C/C++编译器、Thumb的C/C++编译器、ARM连接器,包含工程管理器、代码生成接口、语法敏感(对关键字以不同颜色显示)编辑器、源文件和类浏览器等等。
mdk 使用分散加载文件定位函数
在Keil MDK(Microcontroller Development Kit)中,分散加载文件(Scatter-Loading File)是一种用于配置和定位在嵌入式系统中加载到存储器的程序和数据的文件。
分散加载文件通常使用链接脚本(Linker Script)进行配置,以指定程序和数据在存储器中的位置。
您可以使用分散加载文件和链接脚本来定位函数、变量以及其他程序元素。
以下是在Keil MDK中使用分散加载文件和链接脚本来定位函数的一般步骤:1. **创建分散加载文件**:- 在Keil MDK中,您可以通过选择“Project” > “Options for Target” > “Linker”来配置链接器设置。
- 在链接器选项中,您可以指定分散加载文件的名称和路径。
2. **编辑链接脚本**:- 创建或编辑链接脚本,以便定义程序和数据的存储器布局。
- 在链接脚本中,您可以使用关键字(如`CODE`, `DATA`, `RODATA` 等)来指定不同类型的存储器区域,并在这些区域中定位函数和变量。
- 通过将函数所属的源文件分配给特定存储器区域,您可以将函数定位到相应的存储器位置。
3. **分配函数到存储器区域**:- 在链接脚本中,通过使用`__attribute__` 或`#pragma` 指令(具体语法取决于您的目标芯片和编译器),将函数分配到所需的存储器区域。
- 例如,您可以使用以下方式将函数`myFunction` 分配到FLASH 存储器区域:```cvoid myFunction(void) __attribute__((section(".text")));```或```c#pragma location=".text"void myFunction(void);```4. **编译和链接**:- 编译和链接您的项目,确保分散加载文件和链接脚本配置正确。
scf(分散加载描述文件)程序说明
LPC2294-.SCF文件[ 2007-4-14 3:33:00 | By: CANopen ]分散加载描述文件供ARM-ADS链接器使用,用来决定各个代码段和数据段的存储位置,下面为一个添加注释后的.scf文件例子:;YL-LPC2294片内FLASH分散加载文件;Internal Flash 256kBytes, Address range:0x00000000~0x0003ffff;Internal SRAM 16KBytes, Address range:0x40000000~0x40003fff;External Flash 2MBytes,SST39VF1601, Address range:0x80000000~0x401fffff;External SRAM 512KBytes,IS61LV25616,Address range:0x81000000~0x81080000ROM_LOAD 0x0 ;ROM_LOAD:Name of the load region.;0x0:Start address for ROM_LOAD region.{ROM_EXEC 0x00000000 ;ROM_EXEC:Name for the first execute region.;0x00000000:Start address for the execture region.{Startup.o (vectors, +First)* (+RO) ;Place all code and RO data into this exec region,;and make sure the "vectors" section from "Startup.o";be placed first.}IRAM 0x40000000 ;The second execute region;start address is 0x40000000. {Startup.o (+RW,+ZI) ;Place all RW and ZI data from Startup.o here.}ERAM 0x81068000 ;The third execute region;Start address:0x81068000.{* (+RW,+ZI) ;All reset RW/ZI data to be placed here.}HEAP +0 UNINIT ;The fourth execute region;Start address:Follow the;end of ERAM region.{heap.o (+ZI) ;All ZI data from heap.o to be placed here.}STACKS 0x40004000 UNINIT ;The fifth execute region.{stack.o (+ZI) ;All ZI data from stack.o to be placed here.}}一般一个简单的分散加载描述文件包含三部分:Loader region、Execute region、Input section。
MTK Scatter文件学习
MTK Scatter文件学习概述:分散加载(scatter loading)是ARM 连接接器提供的一个机制,该机制可以把一个可执行映像文件(即Bin文件)分割放置到内存中不同的独立段。
映像(Image)文件有两个视图:加载视图(Load view) 和执行视图(execution view)。
在下载的时候Image regions被放置在memory map当中,而在执行Image前,或许你需要将一些regions放置在它们执行时的地址上,并建立起ZI regions。
例如,你初始化的RW数据需要从它在下载时的在ROM中的地址处移动到执行时RAM的地址处。
在scatter 文件中可以为每一个代码或数据段在装载和执行时指定不同的存储区域地址,Scatlertoading的存储区块可以分成二种类型:装载区:当系统启动或加载时应用程序的存放区。
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行区。
映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。
在系统启动时,C函数库中的__main初始化代码会执行必要的复制及清零操作,使应用程序的相应代码和数据段从装载状态转入执行状态。
为什么需要Scatter文件:制定存储器映射(memory map)的方法基本上有二种,一是在link时使用命令行选项,并在程序执行前利用linker pre-define symbol使用汇编语言制定section的段初始化,二是使用scatter file,即采用“分散加载机制”。
以上二种方法依应用程序的复杂度而定,一针对简单的情况,二针对复杂的情况。
手机属于复杂的情况,必须使用scatter file。
Scatter文件语法:scatter文件是一个简单的文本文件,包含一些简单的语法(分号后面的内容是注释):My_Region 0x0000 0x1000 ;区域名称区起始地址区长度{the context of region ;区内容}每个区由一个头标题开始定义,头中至少包含区的名字和起始地址,另外还有最大长度和其他一些属性选项。
scatter文件的写法
码和数据段的放置位置。这可以通过在 scatter 文件中对单个目标文件进行定义实现,而不是只简单地依
靠通配符。
为了覆盖标准的连接器布局规则,我们可以使用+FIRST 和+LAST 分散加载指令。典型的例子
是在执行块的开始处放置中断向量表格:
LOAD_ROM 0x0000 0x4000
{
EXEC_ROM 0x0000 0x4000
base_designator 用来表示本输出段的起始地址,它可以有两种格式:起始地址值或偏移量。
ห้องสมุดไป่ตู้ttribute
表示本输出段的属性,其可能的取值如下所示:
o PI
位置无关属性
o RELOC
重定位
o ABSOLUTE
绝对地址
o FIXED
固定地址
o UNINIT
未初始化的数据
项目ADS开发环境入门指南
在汇编语言里,这三个变量名为|Load$$IRAM_DATA$$Base|、|Image$$IRAM_DATA$$ Base|和|Image$$IRAM_DATA$$Limit|,可以用以下方法加以引用:
五、链接脚本
ADS的链接脚本是scf后缀的文本文件,名字叫scatter,意思是分散加载描述文件。一个简单的scf的例子如下:
ROM_LOAD 0xE0000004
{
ROM_EXEC 0xE0000004
{
init.o (STARTUP, +FIRST)
* (+RO)
}
IRAM_DATA 0x08000000
CODE32
GLOBAL _start
AREA vectors,CODE,READONLY
ENTRY
3.代码标志,在gcc中是类似
_armboot_start:
这样的代码,但是在ARM汇编中变成了
_ARMBOOT
这样的,去掉了冒号,注意没有缩进。一般代码是有缩进的。
4.一些伪代码,比如变量定义,gcc中是.word,而ARM汇编里是DCD ,宏定义在gcc中是#define,而ARM汇编中则用EQU代替,声明外部变量,gcc是.globle,ARM汇编中使用GLOBAL,或者IMPORT关键字。。
4.1 Target Settings
一般不需要修改,如果需要生成bin文件或者elf文件时,将Post-linker下拉列表选为ARM fromELF。
4.2 ARM fromELF
试图搞懂MDK程序下载到flash(二)--分散加载文件scatter
试图搞懂MDK程序下载到flash(二)--分散加载文件scatter分散加载文件概念对于分散加载文件的概念,在《ARM体系结构与编程》书第11章有明确介绍。
分散加载文件(即scatter file,后缀为 .scf)是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO、RW、ZI等数据的存放地址。
如果不用SCATTER文件指定,那么ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。
但在某些场合,我们希望把某些数据放在知道那个的地址处,那么这时候SCATTER文件就发挥了非常大的作用,而且SCATTER文件用起来非常简单好用。
我越看这个分散加载文件越感觉它的作用和uboot的连接脚本lds 一样。
分散加载文件的格式分散加载描述文件是一个文本文件,它向链接器描述目标系统的存储器映射。
如果通过命令行使用链接器,则描述文件的扩展名并不重要。
分散加载文件指定:①每个加载区的加载地址和最大尺寸;②每个加载区的属性;③从每个加载区派生的执行区;④每个执行区的执行地址和最大尺寸;⑤每个执行区的输入节。
从描述文件的格式就可以看出加载区、执行区和输入节的层次关系。
分散加载文件基本点①编译后输出的映像文件中各段是首尾相连的,中间没有空闲的区域,他们的先后关系是根据链接时参数的先后次序决定的armlinker -file1.o file2.o ...② scatter用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域③有两类域(region):执行域(execution region,一般是ram区域)和加载域(load region,一般是rom区域)④加载域:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码R0、预定义变量RW、堆栈之类和清不清空无关紧要的大片内存区域ZI,都包括在其中。
⑤执行域:就是把加载域进行“解压缩”后的样子。
周立功单片机:分散加载文件浅释
分散加载文件浅释ARM嵌入式开发广州周立功单片机科技有限公司目录1. 适用范围 (1)2. 基础知识 (2)2.1 基本概念 (2)3. 分散加载文件概述 (3)4. 分散加载文件语法 (4)4.14.24.35.15.25.35.45.55.6 加载时域的描述 (4)运行时域的描述 ....................................................................................................... 5 输入段描述 ............................................................................................................... 6 一个普通的分散加载配置 ....................................................................................... 8 多块RAM的分散加载文件配置 ............................................................................ 8 多块Flash的分散加载文件配置 .......................................................................... 10 Flash特殊要求应用 ............................................................................................... 13 段在分散加载文件中的应用 ................................................................................. 13 程序拷贝到RAM中执行应用 .............................................................................. 14 5. 分散加载应用实例 ................................................................................................... 8 工程技术笔记©2008 Guangzhou ZHIYUAN Electronics CO., LTD.11. 适用范围有时候用户希望将不同代码放在不同存储空间,也就是通过编译器生成的映像文件需要包含多个域,每个域在加载和运行时可以有不同的地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.5.1.3 使用分散加载描述文件指定栈和堆 除用分散加载描述文件指定堆和栈外,ARM C 库还提供__user_initial_stackheap() 函数实现堆和栈,并能从给出的分散加载描述信息中自动选择 1 个来实现。 为选择有两个区的内存模型,在分散加载描述文件中分别以 ARM_LIB_HEAP 和 ARM_LIB_STACK 定义两个具有 EMPTY 属性特别执行区。这将促使库选择非默认情况, 使用符号 Image$$ARM_LIB_STACK$$Base、 Image$$ARM_LIB_STACK$$ZI$$Limit、Image$$ARM_LIB_HEAP$$Base 和 Image$$ARM_LIB_HEAP$$ZI$$Limit 来实现堆和栈。默认情况是使用 __user_initial_stackheap()的实现。 因为仅 ARM_LIB_STACK 或 ARM_LIB_HEAP 区能被指定大小,且必须分配大小。 通过定义一个单执行区 ARM_LIB_STACKHEAP,其属性为 EMPTY,可强制 __user_initial_stackheap() 来组合栈/堆区。这促使__user_initial_stackheap()使用 Image$$ARM_LIB_STACKHEAP$$Base 和 Image$$ARM_LIB_STACKHEAP$$ZI$$Limit 符号的值。注意,如果重新执行 __user_initial_stackheap() ,这将覆盖库中所有相关栈和堆的实现。 7.5.1.4 分散加载描述文件与存储器映射之间的关系 为了描述分散加载描述文件与存储器映射之间的关系,下面通过 2 个例子作简单说明, 详细的语法将在 7.5.2 小节中介绍。 简单存储器映射示例
加载区描述的 BNF 语法见 7.5.2.2 的内容,其中: load_region_name 是加载区名,链接器为每个执行区生成一个 Load$$exec_r
egion_name$$base 符号,这个符号保存执行区地址。尽管如此,load_regio n_name 用来区分每个区,而不用来生成 Load$$region_name 符号。注意, 为调试程序创建的映像需要每个区有唯一的基址,因为调试程序必须在各区的加载 地址处加载区。重叠的加载区地址将导致部分映像被覆盖。但是,加载程序或操作 系统可以正确地加载地址重叠的位置独立区,它会将一个或多个位置独立区自动移 到不同的地址处。 base_address 用于指定链接时区中目标文件的地址。base_address 必须是一 个字对齐数值。 +offset 用于描述基址,此地址从前一个加载区末尾偏移 offset 个字节。offset 的值必须能被 4 整除。若是第一个加载区,那么+offset 表示基址从 0 之后的第 o ffset 个字节开始。 attribute_list 用于指定加载区内容的属性。其中,ABSOLUTE 表示绝对地址、P I 表示位置独立、RELOC 表示可重定位、OVERLAY 表示重叠、NOCOMPRESS 表示必须不被压缩、ALIGN alignment 指定对齐限制,对齐值可以从 4 到 align ment,其中 alignment 必须是 2 的正幂。ABSOLUTE、PI、RELOC、OVERL AY 四种属性,只能指定为其中之一,默认加载区属性是 ABSOLUTE。 max_size 用于指定加载区最大长度。若加载区的长度超过 max_size 指定值, 则 armlink 将生成一个错误。 execution_region_description 是执行区描述,用于指定执行区名字,地址和内 容,后面将作详细介绍。 7.5.2.4 执行区描述的语法 执行区描述包含:名称、基址(绝对的或相对的)、最大尺寸(可选)、属性(可选) 以及一个或多个输入节列表(放在本执行区中的模块)。图 7-12 给出了一个典型的执行区 描述的内容及结构。
A::=(BC)+(D|E)表示定义 A 可扩展为 BCD,BCE,BCBCD,BCBCE,BCBCBCD,或 BCBCBCE
等
7.5.2.2 分散加载描述语法概述 分散加载描述使用前面所述的 BNF 语法,并在 BNF 定义中添加了换行和空格,以提高
可读性。它们在分散加载定义中不是必要的,如果存在于文件中,则被忽略。
复杂存储器映射示例
图 7-8 一个复杂存储器映射的分散加载描述文件
图 7-9 一个复杂存储器映射
图 7-8 中的分散加载描述将 program1.o 和 program2.o 文件中的节加载到与图 79 所示的映射相对应的存储器中。 这种复杂的存储器映射是不可能只使用基本的链接命令 行选项就实现的。
7.5.1 分散加载机制
7.5.1.1 何时使用分散加载机制 链接命令行选项提供了一些对数据和代码布局的控制,但如果要对布局进行全面控制则 需要比命令行选项更详细的指令。对于以下一些情况,就需要或最好使用分散加载描述文 件: 复杂存储器映射:代码和数据需要放在多个不同存储器区域,必须详细指明哪个节
分散描述 scatter_description 由一个或多个加载区描述 load_region_description
来定义。加载区描述的 BNF 语法如下:
Scatter_description ::= load_region_description+
其中,load_region_description 由加载区名、属性或尺寸说明符(可选)以及一个 或多个执行区描述 execution_region_description 构成。执行区描述的 BNF 语法如下:
load_region_description ::= load_region_name (base_address | ("+" offset)) [attributes] [max_size] "{" execution_region_description+ "}"
其中,execution_region_description 由执行区名、基址,属性或尺寸说明符(可选) 以及一个或多个输入节描述 input_section_description 构成。输入节描述 BNF 语法如下:
图 7-6 一个简单存储器映射的分散加载描述文件
图 7-7 一个简单存储器映射
图 7-6 中的分散加载描述将目标文件加载到与图 7-7 所示的映射相对应的存储器中。 区的最大尺寸指定是可选的,但只是允许链接器检查区是否超出边界。这个例子中分散加载 描述文件的作用,与使用链接命令选项--ro-base 0x0 和--rw-base 0x10000 是一样的。
7.5 分散加载描述文件
在 7.3 节中已经简单介绍了映像的组成,也介绍了如何用命令选项来构建简单结构的 映像。要构建映像的存储器映射,链接器必须有:描述节如何分组成区的分组信息、描述映 像区在存储器映射中的放置地址的放置信息。
分散加载机制允许为链接器指定映像的存储器映射信息,可实现对映像组件分组和布局 的全面控制。分散加载通常仅用于具有复杂存储器映射的映像(尽管也可用于简单映像), 也就是适合加载和执行时内存映射中的多个区是分散的情况。本节将对 armlink 所使用的 分散加载描述文件作详细介绍。
execution_region_description ::=
exec_region_name (base_address | "+" offset) [attribute_list][max_size | "–" length]
"{" input_section_description*
"}"
表 7-6 BNF 符号及语法
符号
描述
"
双引号内的字符表示其本身,通常用于表示自身为 BNF 语法部分的字符。例如,定义 B"+"C,
它只能替换为 B+C。而定义 B+C 则可以替换为 BC、BBC 或 BBBC
A::=B
将 A 定义为 B。例如,A::= B"+"|C 表示 A 相当于 B+或 C。::=表示法用于定义相对组件而 言的高级结构,其中每个组件中还可能有一个::=的定义,是对更简单的组件进行的定义。例如, A::=B 以及 B::=C|D 表示定义 A 相当于 C 或 D
input_section_selector ::= ("+" input_section_attr | input_section_pattern |
input_symbol_pattern)
图 7-10 给出了一个典型的分散加载描述文件的内容和组织结构。
图 7-10 一个典型分散加载描述文件的结构
其中,input_section_description 由源模块选择模式 module_select_pattern,以 及一个或多个输入节选择器 input_section_selector(可选)组成。输入节描述及输入节 选择器的 BNF 语法如下:
input_section_description ::= module_select_pattern [ "(" input_section_selector ( "," input_section_selector )* ")" ]
7.5.2 分散加载描述文件的语法
分散加载描述文件是一个文本文件,它向链接器描述目标系统的存储器映射。如果通过 命令行使用链接器,则描述文件的扩展名并不重要的。分散加载描述文件指定:
每个加载区的加载地址和最大尺寸;
每个加载区的属性; 从每个加载区派生的执行区; 每个执行区的执行地址和最大尺寸; 每个执行区的输入节。 从描述文件的格式中就可看出加载区、执行区和输入节的层次关系。 7.5.2.1 BNF 表示法和语法 分散加载描述文件由分散描述组成,分散加载描述使用 BNF(Backus-Naur Form) 语法。BNF 范式是一种用来描述计算机语言语法的符号集,表 7-6 概要地描述了分散加载 描述文件中所使用的 BNF 符号及语法。