关于涣散加载的概念,在《ARM体系结构与编程》书中第11章有清晰介绍。
涣散加载文件(即scatter file 后缀为.scf)是一个文本文件,经过编写一个涣散加载文件来指定
ARM连接器在生成映像文件时怎么分配RO,RW,ZI等数据的寄存地址。假如不必SCATTER文件指定,那么
ARM连接器会依照默许的方法来生成映像文件,一般情况下咱们是不需要运用涣散加载文件的。
但在某些场合,咱们期望把某些数据放在指定的地址处,那么这时候SCATTER文件就发挥了十分大的效果
并且SCATTER文件用起来十分简略好用。
举个比如:比如像LPC2378芯片具有多个不接连的SRAM,通用的RAM是32KB,但是32KB不够用,我想把
某个.C中的RW数据放在USB的SRAM中,那么就可以经过SCATTER文件来完结这个功用。
下面是就这个比如作的阐明:
这是一个规范的常用的涣散加载文件,现在加注释于后,便利今后查阅:
;******************************************************************************
;
; SCATTER LOADING DESCRIPTION
; ARM
; KEILs 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) ;;将vectors.c编译后生成的文件vectors.o中的代码
init.o (INIT) ;;以及init.o中的代码
* (+RO) ;;以及一切编译生成的RO特点的代码悉数寄存在
} ;;运转时域ER_IROM1指定的地址范围内,寄存方法:次序寄存
RW_IRAM1 0x40000000 0x0000e800 ;;这是第二个运转时域,功用同上
{ ;;其间 *是代表具有()里边指定的特点的悉数数据
*(+RW,+ZI) ;;与*功用类似的有.ANY,后边阐明
} ;; The following declarations select the “two region model” ;
;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {} ;;指定仓库地址
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}
下面是针对LPC2378的USB SRAM作数据RAM运用的装备:
;******************************************************************************
;
; SCATTER LOADING DESCRIPTION
; ARM
; KEILs 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” ;
WEBRPGRADE 0x7fd00000 0x1fff
{
webupgrade.o(+RW,+ZI) ;;webupgrade.o文件中一切变量都存在USB SRAM中
}
;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {}
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}