ADS分散加载文件语法:
;加载域书写格式:加载域名称 起始地址 属性(可省略) 最大长度(可省略)
;
;加载域起始地址:可以使用绝对地址和偏移地址
;加载域属性:ABSOLUTE:绝对地址,默认属性,不允许加载域互相重叠
; PI:位置无关,允许加载域互相重叠
; RELOG:重定位,允许加载域互相重叠,执行域没有本属性但可以继承加载域的属性
; OVERLAY:覆盖,允许加载域互相重叠,可以在相同地址上建立多个执行域,ADS不支持本属性
;加载域包含1个或多个执行域
;执行域书写格式:执行域名称 起始地址 属性(可省略) 最大长度(可省略)
;
;执行域起始地址:可以使用绝对地址和偏移地址,使用偏移地址(要求可以被4整除的数)的执行域不能指定属性
;执行域属性:ABSOLUTE:绝对地址,默认属性,不允许执行域互相重叠
; FIXED:固定地址,加载和执行都是同一地址,必须使用绝对地址或0偏移地址
; PI:位置无关,允许执行域互相重叠
; OVERLAY:覆盖,允许执行域互相重叠
; UNINIT:未初始化,ZI段将不会被初始化为0,仅仅保留了内存单元,而没有将各初始写入内存单元,或者将内存单元初始化为0
;执行域包含1个或多个输入段
;输入段书写格式:包括模块描述和段描述
;
;模块描述:指定包含模块的文件(包括目标文件.o和库文件.LIB)搜索范围,可以使用通配符*和?
; *.o(所有目标文件)
; *(所有目标文件和库文件)
; .ANY(所有文件)不论放在文件哪个位置,本描述被最后解析,相当于“剩下的所有文件”
;模块:汇编用AREA声明的段,例如AREA StackBottom, DATA, NOINIT
; C中指定段:#pragma arm section rwdata = "SRAM",zidata = "SRAM"
;
;段描述:包括属性描述和段名描述
;
;属性描述:(+ 属性)
; RO:只读代码段+数据段,也可表达为TEXT
; RO-CODE:只读代码段
; RO-DATA:只读数据段
; RW:读写代码段+数据段,也可表达为DATA
; RW-CODE:读写代码段
; RW-DATA:读写数据段
; ZI:初始化为0的数据段,也可表达为BSS
; ENTRY:包含入口点的输入段
;伪属性:FIRST:放在最前
; LAST:放在最后
;
;段名描述:(输入段名)只能用在汇编语言中
;周立功的例程总共三个分散加载文件mem_a.scf,mem_b.scf,mem_c.scf,区别是加载地址不一样
;具体加载哪个,在DebugInExram->ARM Linker->Scatter定义,链接类型选择Scattered
ROM_LOAD 0x0 ;ROM_LOAD 为加载域的名称,其后面的0x0 表示加载域的起始地址(存放程序代码的起始地址)
;image entry point一定要跟ROM_LOAD值一样
{
ROM_EXEC 0x00000000 ;ROM_EXEC 描述了执行域的地址,放在第一块位置定义
{
Startup.o (vectors, +First) ;从起始地址开始放置向量表(Startup.o 为Startup.s 的目标文件)
;+First表示Vector段放在最前面
* (+RO) ;接着放置其它代码(* 是通配符,类似WINDOW下搜索用的通配符)
}
IRAM 0x40000000 ;变量域IRAM ,内部RAM的起始地址为0x40000000
{
Startup.o (MyStacks) ;放置Startup.o (MyStacks)
}
STACKS_BOTTOM +0 UNINIT ;+0表示接着上一段,UNINIT 表示不初始化
{
Startup.o (StackBottom) ;放置AREA StackBottom, DATA, NOINIT
}
STACKS 0x40004000 UNINIT ;接着从0x40004000 开始,放置 AREA Stacks, DATA, NOINIT UNINIT 表示不初始化
{
Startup.o (Stacks)
}
ERAM 0x80000000 ;外部RAM从0x80000000开始为变量域
;如果片外RAM起始地址不为0x8000 0000,则需要修改mem_.scf文件
{
* (+RW,+ZI)
}
HEAP +0 UNINIT ;+0表示接着上一段,UNINIT 表示不初始化
{
Startup.o (Heap) ;放置堆底, AREA Heap, DATA, NOINIT
}
HEAP_BOTTOM 0x80080000 UNINIT ;接着在外部0x80080000 放置堆顶
;这个地址是片外RAM 的结束地址,根据实际情况修改
{
Startup.o (HeapTop)
}
}
“PI” 属性使用示例:
LR_1 0x010000 PI ; 加载域起始地址0x010000.
{
ER_RO +0 ; 执行域从加载区继承PI属性
; 默认执行域起始地址是0x010000, 在此处可以被移动
{
*(+RO) ; 所有RO段.
}
ER_RW +0 ABSOLUTE ; PI属性被ABSOLUTE取代
{
*(+RW) ; RW被紧接着放置,不能移动
}
ER_ZI +0 ; ER_ZI执行域在ER_RW执行域后面
{
*(+ZI) ; 所有ZI段被连续放置
}
}
LR_1 0x010000 ; 加载域起始地址0x010000.
{
ER_RO +0 ; 执行域从加载区继承ABSOLUTE属性
; 默认执行域起始地址是0x010000, 在此处不能移动
{
*(+RO) ; 所有RO段.
}
ER_RW 0x018000 PI ; PI属性取代ABSOLUTE
{
*(+RW) ; RW被放置在0x018000,在此处可以被移动
}
ER_ZI +0 ; ER_ZI执行域在ER_RW执行域后面
{
*(+ZI) ; 所有ZI段被连续放置
}
}