Scatter Loading 讲义
Scatter Loading 讲义
Scatter Loading 讲义
修改纪录
Revision Date Reviser Comments
1.0 2006-06-15 杨国民 Initial version
1.1 2006-12-13 傅航宇 Integrated other doc
2.0 2006-12-14 傅航宇 Revise and complement
Scatter Loading 讲义
目 录
1.概述................................................................................................................................................... 4
2. 目的 ................................................................................................................................................... 4
3. 参考资料............................................................................................................................................ 4
4. ARM Image......................................................................................................................................... 4
5. Scatter loading的介绍......................................................................................................................... 6
6. Scatter loading应用举例..................................................................................................................... 9
7. 应用机制.......................................................................................................................................... 11
7. 工程应用.......................................................................................................................................... 14
附录 ...................................................................................................................................................... 18
Scatter Loading 讲义
1.概述
该文档说明 Scatter Loading 的意义以及在系统中的实际应用。
2. 目的
通过例子代码,让开发者了解 Scatter Loading 在 ARM Linker 中存在的意义,结合具体
的应用和工程实例,详细说明了其作用和使用方法。
3. 参考资料
1、ARM公司的技术文档DAI0048A_scatterload.pdf,它是QualComm SR833973 回复中
的推荐读物。它放在http://www.arm.com/pdfs/DAI0048A_scatterload.pdf。
2、《Scatter File 介绍》杨彬
3、80-V5842-1.pdf
4、80-V6306-1_Rev_C_MSM6250_BSP.pdf
4. ARM Image
ARM中的源文件经过编译器编译生成的目标文件(Object file)和相应的C/C++运行时
库(Runtime Library)经过连接器的处理后,生成ELF格式的映像文件(image)——它可以
被写入目标设备的ROM中直接运行或加载后运行。
它的组成如图所示:
Scatter Loading 讲义
一个映像文件由一个或多个域(region)组成;
一个域包含一个或多个输出段(output section);
一个输出段包含一个或多个输入段(input section);
一个输入段包含了目标文件中的代码或数据;
输入段通常有以下三类:
RO:代码和常量数据;
RW:带初始值的数据;
ZI: 无初始值的数据;
ARM映像文件各组成部分在存储系统中的地址有两种:
z 装载区域
程序在装载之后,运行之前所占有的存储区域能够被分成多个装载区域,每个装载区域
就是一个连续的字节块。
z 运行区域
程序在运行时所占有的存储区域能够被分成多个装载区域,每个装载区域也是一个连续
的字节块。
注意:一个装载区域可能包含多个运行区域;一个运行区域只能属于一个装载区域。
在一个简单的嵌入式计算机系统中,存储器一般被分成 ROM 和 RAM。连接器生成的
映像被分成“Read-Only”段(包含代码和只读数据)和“Read-Write”段(包含已初始数据
和未初始化数据,未初始化数据也叫 ZI 数据)。通常,在程序下载(烧入)的时候,它们会
被一块下载到 ROM 上;而在程序开始执行时,Read-Write 段会从 ROM 被 Copy 到 RAM。
如图所示:
对于简单的映像文件,我们可以在 ARM 连接器(armlink)时,使用-RO exec-address
和-Rw exec-address 选项,直接为 Read-Only 段和 Read-Write 段指定运行时映射地址。注意,
在这种情况下,在装载的时候,程序的 RO 段会被装载在基地址为 exec-address 的区域,RW
段会紧随其后放置;而在执行的时候,RO 段会保持不动,RW 段会被拷贝到指定地址,同
时会在 RW 段的后面自动创建一个 ZI 段。
连接器在连接的时候,会根据所传入的地址创建一些符号。这些符号描述了每个区域的
Scatter Loading 讲义
执行地址以及它们的限制地址。如图所示:
以上是一个简单的例子,但在复杂的嵌入式系统中,其存储器往往包括 ROM,SRAM,
DRAM,FLASH 等等。此时,简单的-RO、-RW 选项已无法满足要求。如下图所示:
5. Scatter loading 的介绍
Scattter loading 是 ARM 连接器(armlink)提供的一种机制,该机制让你能够把可执行
映像文件分成多个区域,然后分别为它们指定在存储器上的存储位置。
Scatter loading 机制用于定位装载区域和运行区域在分离的存储映像中的位置。
在 ARM 连接器中,有两种方式来指定装载区域和运行区域在存储器中的映射位置。
Scatter Loading 讲义
1) 用-RO 和-RW 命令选项定位运行区域
2)用 Scatter loading 定位区域
实际上它也要通过 Linker 的命令行选项传递给连接器。格式如下:
-scatter scatter_description_file
使用 scatter loading 后,通过选项-output 可以指定输出 Image 的格式,现在支持三种格
式:BIN 文件,AIF BIN 文件和 ELF 文件。
Scatter File实际上是一个具有简单语法规则的文本文件,可以用来描述ARM连接器生成
映像文件时所需的信息:
各个加载时域的加载地址、最大尺寸和属性;
从每个加载时域中分割出的运行时域;
各个运行时域的起始地址、最大尺寸和属性;
各个运行时域存储访问特性;
各个运行时域中包含的输入段;
典型的Scatter File构成如下图所示(以一个加载时域为例)
Load_region_name Base_designator [attribute_list] [max_size]
{
Exec_region1_name Base_designator [attribute_list] [max_size]
{
module_selector_pattern (input_selectors)
}
Exec_region2_name Base_designator [attribute_list] [max_size]
{ ... }
}
5.1. 加载时域
Load_region_name:
加载时域名称,最大31个ASCII字符,只用于标识一个加载时域;
Base_designator:
本加载时域的起始地址,它有两种形式:
1)base_address:本加载时域中的对象在连接时的起始地址,必须字对齐;
2)+offset:本加载时域中的对象在连接时的起始地址是在前一个加载时域的结束地址
后偏移offset(字节)处。
attribute_list
本加载时域的属性,默认为ABSOLUTE。可选项;
max_size
本加载时域的最大尺寸(字节)。若实际尺寸越界,连接器将会报错。默认为0xFFFFFFFF。
可选项;
Scatter Loading 讲义
5.2. 运行时域
Exec_region_name:
运行时域名称,最大31个ASCII字符,除了用于标识一个运行时域外,还用来构成连接
器生成的连接符号;
Base_designator:
本运行时域的起始地址,同“加载时域”:
attribute_list:
本加载时域的属性,默认为ABSOLUTE。可选项;常用的FIXED表明本域的加载地址
和运行地址是相同的,都通过base_designator指定,且必须是绝对地址或offset为0;
max_size:
本加载时域的最大尺寸(字节)。若实际尺寸越界,连接器将会报错。默认为0xFFFFFFFF。
可选项;
5.3. 输入段
module_selector_pattern:
定义了一个文本字符串的匹配模式。匹配字符为*(多个字符)和?(单个字符)。匹配
时,不区分大小写,如:
- disp*.o (+RO) :匹配所有以disp开始的.o目标文件作为输入段;
- *pmic.lib(+RW) :匹配所有以pmic结束的.lib文件作为输入段;
- .ANY(+ZI) :匹配所有前面未匹配到的输入段,并指定连接器自行安排该输入
段的位置;
input_selectors:
定义了一个用逗号分割的模式列表。该列表中的每个模式定义了输入段名称或输入段属
性的匹配方式:
[+] input_section_pat | input_section_attrs,…,
- input_section_pat :输入段名称,通常为汇编代码某个区域,前面不用“+”;
- input_section_attrs :输入段属性的匹配方式,通常为:
RO-CODE
RO-DATA
RO(=RO-CODE + RO-DATA)
RW-DATA
RW(=RW-DATA)
ZI
CODE(=RO-CODE)
CONSTDATA(=RO-DATA)
TEXT(=CODE / RO-CODE)
DATA(=RW)
BSS(=ZI)
Scatter Loading 讲义
5.4. 连接器符号
连接器使用 Scatter loading file 后创建的符号表与前面的些不同。具体如图所示。
其规则如下:
z 对于 RO 和 RW 段
Load$$region_name$$Base 表示 region_name 区域的装载地址;
Image$$region_name$$Base 表示 region_name 区域的执行地址
Image$$region_name$$Length 表示 region_name 区域的长度(单位:字节)
z 对于 ZI 段
Image$$region_name$$ZI$$Base 表示 region_name 区域的执行地址
Image$$region_name$$ZI$$Length 表示 region_name 区域的长度(单位:字节)
连接器会顺序放置所有的区域。优先顺序是:RO Code>RO based Code>RO data>
RW Code > RW based Data > non-zero initialized Data > ZI。
6. Scatter loading 应用举例
1) 例子 1
假设一个嵌入系统上有一块 ROM(开始地址是 0x01000000)和一块 RAM(开始地
址是 0x00008000)。现在有一个 object1.o 包含 10KB 的 Code 和 10KB 的初始化数据。
如果有如下的 Scatter loading 描述文件被应用
Scatter Loading 讲义
此描述文件说明在 Load 时把 Object1 的 Code 和 Data 一起放在 ROM 上,运行时把
RW 段 Copy 到 RAM 并创建相同大小的 ZI 段。
导致的结果将会是 Linker 创建如下的符号表:
2) 例子 2
假设如下嵌入系统
如果有如下的 Scatter loading 描述文件被应用。
Scatter Loading 讲义
一个疑问:ROM_2 指的是 EEPROM 吗?如果是,为什么地址是 0x4000?如果不是,
那 EEPROM 干什么用?
结果将是:在 Load 时,Object1 会放在 ROM 上,初始地址为 0x0000;Object2 会放在
ROM 上,初始地址为 0x4000。
符号表如下所示:
7. 应用机制
大多数嵌入式系统在进入应用主程序之前有一个初始化的过程,该过程完成
Scatter Loading 讲义
系统的启动和初始化功能。缺省的 ADS 初始化过程如上图所示。
总体上,初始化过程可以分成两部分来看:
1. _main 负责设置运行映像存储器映射;
2. _rt_entry 负责库函数的初始化。
_main 完成代码和数据的复制,并把 ZI 数据区清零。这一步只有当代码和数据区在存
储和运行时处于不同的存储器位置时才有意义。接着_main 跳进_rt_entry,进行 STACK
和 HEAP 等的初始化。最后_rt_entry 跳进应用程序的入口 main()。当应用程序执行完时,
_rt_entry 又将控制权交还给调试器。
函数 main()在 ADS 中有特殊的意义。当一个程序工程项目中存在 main()时,连接器
会把_main 和_rt_entry 中的初始化代码连接进来;如果没有 main()函数,初始化过程就
不会被连接,结果就会导致一些
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的 C 库函数无效。
但在实际的嵌入式系统中,在启动时都会有一些系统级的初始化操作,不能简单由 C
库函数__main()来完成。
以 Sekito 为例,通过重载__main(),在其中完成了系统初始化以及代码和数据的拷贝(即
分散装载),其初始化过程可以简单图示如下:
Scatter Loading 讲义
__rt_entry
Set up application stack
and heap
Initialize library functions
Exit from application
C Library
Reset_Handler
Reset system
__main (overload)
Initialize system
Copy code and data
Zero unitialized data
Bootloader
main()
Causes the linker to pull
in library initialization
code
User Code
RootRegion(根区)
根区是一个特殊的输出段,它的加载地址与执行地址是一致的。每个 scatter 文件至少
有一个根区。分散加载有一个限制:创建运行时域的代码和数据(即完成拷贝和初始化的代
码和数据)无法自行复制到另一个位置。因此,在根区中必须含有下面的部分:
拷贝代码/数据的代码,如_main.o;
被拷贝代码/数据的地址(符号表),如连接器输出变量$$Table 和 ZISection$$Table。
由于上面两个部分的属性是只读的,因此他们被*〈+RO〉通配符语法匹配。如果
*〈+RO〉被用在了非根区中,则在根区中必须显式地指明另一个 RO 区域。
下面是一个例子:
LOAD_ROM 0x0000 0x4000
{
EXE_ROM 0x0000 0x4000 ;rootregion
{
_main.o〈+RO〉 ;copyingcode
*〈Region$$Tabl0e〉 ;RO/RWaddressestocopy
*〈ZISection$$Table〉 ;ZIaddressestozero
}
RAM 0x10000 0x8000
{
*〈+RO〉 ;allotherROsections
*〈+RW,+ZI〉 ;allRWandZIsections
Scatter Loading 讲义
}
}
7. 工程应用
在这里,结合具体的项目 SEKITO,简单介绍一下 Scatterloading 的应用。
SEKITO 有两个映像文件:
一为 bootloader 映像,其对应的 scatter 文件为 Boot_loader.scl;
一为 amss 映像,其对应的 scatter 文件为 M6250_rom.scl。
而整个系统,从上电到完全启动,BootLoader 和 AMSS 的地址移动和运行和分为四个
步骤:
1. 拷贝 Boot Loader 到加载地址
2. Boot Loader 按其 SCL 进行运行时域布局
3. 拷贝 AMSS Image 到加载地址
4. AMSS Image 按照其 SCL 进行运行时域布局
下面结合着各自的 SCL 文件配合介绍:
Boot_loader.scl 如下所示:
CODE_ROM 0xffff0000 0x27ff
{
BB_PAGE_MINI_LDR 0xffff0000
{
bootpg_mini.o (+RO, +FIRST)
mpmc.o ( +RO)
sdram_init.o(+RO)
}
NAND_SDRAM_COPY 0x03ffd800
{
boot_copy_nand.o (+RO, +FIRST)
jnand.o(+RO)
flash_nand.o(+RO)
flash_nand_samsung.o(+RO)
clkrgm_6250.o(+RO)
* (+RO)
}
BB_DATA +0x0
{
* (+RW, +ZI)
}
加载时域CODE_ROM,起始地址0Xffff0000,
最大尺寸0x27ff;
第 1 个运行时域 BB_PAGE_MINI_LDR,起始地
址 0xffff0000,位于 SRAM 中。
+FIRST 选项使得重载的__main()位于地址的
最开始位置。
该时域为根区,bootpg_mini.s 中定义了代码
和数据的地址符号,以及拷贝程序;mpmc.s、
sdram_init.s 是用于在拷贝前初始化 SDRAM
的功能函数
第 2个运行时域 NAND_SDRAM_COPY,起始地址
0x03ffd800,位于 SDRAM 中
Scatter Loading 讲义
}
Sekito 系统中,在上电前,所有的代码及数据均存储在 Nand Flash 中,Boot loader Image
和 AMSS Image 也在其中,但这并不是它们的加载地址。
1) 第一步,拷贝 Boot Loader 到加载地址:
当系统上电时,Boot Sequencer 将 Nand Flash 第一块的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
(即 Boot loader Image),
拷贝到其加载地址 0xFFFF000(位于 Boot SRAM)中。如图所示:
Boot Loader 被拷贝到加载时域
2) 第二步,Boot Loader 按其 SCL 进行运行时域布局:
Boot Sequencer 在完成拷贝后,将控制权交给 ARM 处理器,程序从 0xFFFF0000
处开始执行(即__main)。__main(位于 Boot Loader 根区),紧接着会将加载地址和运
行地址不同的部分(这里是 NAND_SDRAM_COPY、BB_DATA),拷贝至其运行时域
(位于 SDRAM 的顶端),并初始化 ZI 区:
Boot Loader 按 SCL 进行运行时域布局
M6250_rom.scl 如下所示:
MSM_CODE_DATA 0x0 0x2000000
{
BOOT 0x0 0x2000000
{
boot_vectors.o (Int_Vect, +FIRST)
boot_reset_handler.o (RST_Handler)
加载时域MSM_CODE_DATA,起始地址0x0,最大尺寸
0x2000000;
第1个运行时域BOOT,起始地址0x0,最大尺寸
0x2000000。包含了指定目标文件的RO输入段,
boot_vectors.o中的Int_Vect区域位于本运行域
的最前面——即0x0处开始为异常向量表;
Scatter Loading 讲义
boot_data.o (+RO)
bootmem.o (+RO)
…
}
MAIN_APP_1 +0x0 0x50000
{
disp*.o (+RO)
qw.o (+RO)
clk*.o (+RO)
hw*.o (+RO)
.ANY (+RO)
}
MAIN_APP_2 +0x0 0x350000
{
.ANY (+RO)
}
MAIN_APP_3 +0x0 0x400000
{
.ANY (+RO)
}
MAIN_APP_4 +0x0 0x400000
{
.ANY (+RO)
}
MAIN_APP_5 +0x0 0x400000
{
.ANY (+RO)
}
MAIN_APP_6 +0x0 0x400000
{
.ANY (+RO)
}
MAIN_APP_7 +0x0 0x400000
{
.ANY (+RO)
}
接下来是boot_reset_handler的RST_Handler区域
的代码
第2个运行时域MAIN_APP_1,起始地址紧接着时域
BOOT,最大尺寸0x50000。
匹配所有disp开始的.o目标文件中的RO输入段
…
连接器自动安排RO输入段
第3个运行时域MAIN_APP_2,起始地址紧接着时域
MAIN_APP_1,最大尺寸0x350000。连接器自动安排
RO输入段;
第4个运行时域MAIN_APP_3,起始地址紧接着时域
MAIN_APP_2,最大尺寸0x400000。连接器自动安排
RO输入段
同MAIN_APP_3;
同MAIN_APP_4;
同MAIN_APP_5;
同MAIN_APP_6;
直到MAIN_APP_6,各域的加载地址和运行地址都一
致。但从APP_RAM开始,加载地址和运行地址开始
不一致。此时需要自己写代码来移动——见附录
Scatter Loading 讲义
APP_RAM SCL_APP_RAM_BASE
{
bootapp.o (BOOTAPP_IVECT, +FIRST)
* (+RW)
}
BB_RAM +0x0
{
dloadarm.o (+RW)
}
ZI_REGION +0x0
{
*(+ZI)
boot_stacks.o (Stacks)
dloadarm.o (+ZI)
cache_mmu.o(PAGE_TABLE_BASE)
}
UNINIT_RAM UNINIT_RAM_BASE
{
*_nzi.o (+ZI)
}
INTERNAL_BOOT_RAM_1 0xFFFF0000
0x27FF
{
boot_config_sleep.o (+RO)
}
INTERNAL_BOOT_RAM_2 0xFFFF4000
0x1FFF
{
boot_config_burst.o (+RO)
}
}
第9个运行时域APP_RAM;起始地址为
SCL_APP_RAM_BASE(只要大于前8个时域的尺寸总
和即可,+0最省RAM)
最前的2句ARM指令是保留给IRQ和FIQ中断处理函
数用的,即使没用,也会引起一个软复位;
其 余 为 所有 RW 输 入段 ( 除 BB_RAM 时域 中的
dloadarm.o中的RW)。
第10个运行时域BB_RAM;起始地址为紧接着
APP_RAM,只包含了dloadram.o中的RW输入段
第10个运行时域ZI_REGION;起始地址为紧接着
BB_RAM,包含了所有ZI输入段。其中boot_stacks.o
的Stacks区域、dloadarm.o的ZI区域和
cacke_mmu.o的PAGE_TABKE_BASE区域排在最后。因
没有初值,所以不需要加载后重新移动时域。但可
以利用时域名称构成的连接符号来快速初始化ZI
区域,详见附录
第11个运行时域UNINIT_RAM;起始地址为
UNINIT_RAM_BASE,这里定义了一些没有初始值,
但需要在复位时保持不变的特殊变量
第12个运行时域INTERNAL_BOOT_RAM_1;起始地址
为0xFFFF000(IRAM中),最大尺寸0x27FF。需要
在访问时移动时域,详见附录
第13个运行时域INTERNAL_BOOT_RAM_2;起始地址
为0xFFFF400(IRAM中),最大尺寸0x1FFF。需要
在访问时移动时域,详见附录
第一个运行时域 BOOT 为根区,其中 Boot_data.s 定义了从第 9 个运行时域 APP_RAM
开始,到 ZI_REGION 所有的代码和数据的地址符号;Boot_mem.c 负责其拷贝及初始化。所
以这两个文件及其调用到的代码必须放在根区中。
3) 第三步,拷贝 AMSS Image 到加载地址:
Scatter Loading 讲义
AMSS Image 是由 Boot Loader 从 Nand Flash 中,拷贝到其加载时域的。当 Boot
Loader 按 SCL 规则,完成运行时域的布局后,就会执行其 NAND_SDRAM_COPY 段的程序,
将 Flash 中的 AMSS Image 完全拷贝到 SDRAM 的起始地址 0x00000000(即 AMSS Image
的加载地址):
AMSS Image 被拷贝至加载地址
4) 第四步,AMSS Image 按照其 SCL 进行运行时域布局:
Boot Loader 在完成 AMSS Image 的加载后,将跳转到 AMSS Image 的入口
Reset_Handler(位于 AMSS 根区起始处)。在 Reset_Handler 完成初始化工作后,就会
将 AMSS 中加载地址和运行地址不同的部分(图中的 Unfixed Region)拷贝到其运行时
域中,并初始化 ZI 区:
AMSS 按 SCL 规则进行运行时域布局
附录
z Bootpg_mini.s
负责将 Bootloader 拷贝到 SDRAM
IMPORT |Image$$NAND_SDRAM_COPY$$Base|
IMPORT |Image$$NAND_SDRAM_COPY$$Length|
IMPORT |Load$$NAND_SDRAM_COPY$$Base|
IMPORT |Image$$BB_DATA$$Base|
IMPORT |Image$$BB_DATA$$Length|
导入连接器生成的符号表
Scatter Loading 讲义
IMPORT |Load$$BB_DATA$$Base|
IMPORT |Image$$BB_DATA$$ZI$$Base|
IMPORT |Image$$BB_DATA$$ZI$$Length|
CODE32
ENTRY
__main
重载__main(),作为映像文件的入口
; =======================
; Copy the boot loader to SDRAM to SDRAM
; =======================
ldr r0, =|Load$$NAND_SDRAM_COPY$$Base|
ldr r1,
=|Image$$NAND_SDRAM_COPY$$Base|
ldr r2,
=|Image$$NAND_SDRAM_COPY$$Length|
loop1 blockCopy32
; ================================
; Copy the boot loader RW DATA to SDRAM
; from the load region to SDRAM
; ================================
ldr r0, =|Load$$BB_DATA$$Base|
ldr r1, =|Image$$BB_DATA$$Base|
ldr r2, =|Image$$BB_DATA$$Length|
loop2 blockCopy32
; ==================================
; initialize the zero init data region
===================================
ldr r0, =|Image$$BB_DATA$$ZI$$Base|
ldr r1, =|Image$$BB_DATA$$ZI$$Length|
add r2, r0, r1
mov r3, #0
zero_init_loop
str r3,[r0]
add r0, r0, #4
cmp r0, r2
blt zero_init_loop
根据符号,进行代码和数据的拷贝及
初始化
z 在 Boot_data.s 和 Bootapp.s 中,这些符号会被导入,然后重命名后导出。具体代码形如:
IMPORT |Image$$MAIN_APP_1$$Base|
IMPORT |Image$$MAIN_APP_1$$Length|
……
导入地址符号
EXPORT Image__MAIN_APP_1__Base
EXPORT Image__MAIN_APP_1__Length
……
导出新符号
Image__MAIN_APP_1__Base 重命名符号:
Scatter Loading 讲义
DCD |Image$$MAIN_APP_1$$Base|
Image__MAIN_APP_1__Length
DCD |Image$$MAIN_APP_1$$Length|
……
注:因为其他的启动程序是用 C 写的,而
ARM 编译器和 C 库函数都不识别 Linker 生
成的符号,所以要重命名。
z 在 Bootmem.c 中会利用导出的符号把代码或数据 Copy 到指定区域。代码形如:
uint32 boot_ram_init()
{
/* APP_RAM region reallocation */
stop_point = (dword *) ( (dword) Image__APP_RAM__Base +
(dword) Image__APP_RAM__Length);
for( src32 = (dword *) Load__APP_RAM__Base,
dst32 = (dword *) Image__APP_RAM__Base;
dst32 < stop_point;
src32++, dst32++ )
{
*dst32 = *src32;
}
…
/* BB_RAM region reallocation */
stop_point = (dword *) ( (dword) Image__BB_RAM__Base +
(dword) Image__BB_RAM__Length);
for( src32 = (dword *) Load__BB_RAM__Base,
dst32 = (dword *) Image__BB_RAM__Base;
dst32 < stop_point;
src32++, dst32++ )
{
*dst32 = *src32;
}
…
/*Initialization of ZI_REGION */
stop_point = (dword *) ( (dword) Image__ZI_REGION__ZI__Base +
(dword) Image__ZI_REGION__ZI__Length);
for( dst32=(dword *) Image__ZI_REGION__ZI__Base;
dst32 < stop_point;
dst32++ )
{
*dst32 = 0;
}
z clknregime_set_mclk_sleep()
{
Scatter Loading 讲义
/* INTERNAL_BOOT_RAM_1 region reallocation */
stop_point = (dword *) ( (dword) Image__INTERNAL_BOOT_RAM_1__Base +
(dword) Image__INTERNAL_BOOT_RAM_1__Length);
for(src32 = (dword *) Load__INTERNAL_BOOT_RAM_1__Base,
dst32 = (dword *) Image__INTERNAL_BOOT_RAM_1__Base;
dst32 < stop_point; src32++, dst32++ )
{
*dst32 = *src32;
}
set_sdram_self_refresh_and_tcxo_off();
}
z prepare_configure_ebi1_burst_memory()
{
/* INTERNAL_BOOT_RAM_2 region reallocation */
/* Copy the code to configure the burst memory from the load region to the
execute region and then invoke the function. */
stop_point = (dword *) ( (dword) Image__INTERNAL_BOOT_RAM_2__Base +
(dword) Image__INTERNAL_BOOT_RAM_2__Length);
for( src32 = (dword *) Load__INTERNAL_BOOT_RAM_2__Base,
dst32 = (dword *) Image__INTERNAL_BOOT_RAM_2__Base;
dst32 < stop_point; src32++, dst32++ )
{
*dst32 = *src32;
}
/* Configure the burst memory device and enable the corresponding memory
controller burst access mode. This function must not execute from
the flash device being configured. */
boot_configure_ebi1_burst_memory
(ebi1_chip_select, mem_device, ebi_cs_cfg0_value, ebi_cs_cfg1_value );
}
1.概述
2. 目的
3. 参考资料
4. ARM Image
5. Scatter loading的介绍
6. Scatter loading应用举例
7. 应用机制
7. 工程应用
附录