|
发表于 2009-7-18 14:23:17
|
显示全部楼层
资料不错,配合下面看会更好.
简单应用时可以不写.scf文件。而在"Output"页中选择"Simple".然后填写"RO Base"和"RW Base"的起始地址。在"Lay Out"页中,填写Object/Symble: Startup.o, Section: Start.编写启动文件:Startup.s.
在"Option"页里的"Image Entry Point"填入起始地址。
--------------------------------------------------------------------------------
Scatter-Load Description File的结构:
".scf"文件中的"+RW"对应".s"源文件中的"READWRITE".
".scf"文件中的"+ZI"对应".s"源文件中的"NOINIT".
".scf"文件中的"+RO"对应".s"源文件中的"READONLY".
在".s"源文件中有:
AREA area_name CODE/DATA,READONLY/NOINIT/READWRITE
END
".scf"的例子
内容 注解
ROM_LOAD 0x80000000
{ Name of Load Region, Start Address for Load Region and Maximum size of Load Region(省略了)
ROM_EXEC 0x80000000 0x20000
{ 片外存储区,从0x80000000开始,最多0x20000字节。
Startup.o(Vector,+First) Startup模块的Vector段放在最前面。注1
*(+RO) 其他所有模块中的所有代码和只读的数据放在这里。
}
IRAM 0x40000000 0x00004000
{ 片内RAM区,从0x40000000开始,最多0x4000字节
Startup.o(MyStacks,+first) 指定Startup.o中MyStacks放在最前面。
Startup.o(+RW,+ZI) Startup.o中的其他+RW/+ZI段。注1
os_cpu_a.o(+RW,+ZI)
}
STACKS 0x40004000 UNINIT
{ 片内16K RAM的顶端,存放不需要被"C library"初始化的段。
Stack.o(+ZI) 注2
}
ERAM 0x80040000
{
*(+RW,+ZI)
}
HEAP +0 UNINIT
{ "+0"表示接着上一段"ERAM"的结尾,继续安排存储区。
Heap.o(+ZI) 注3
}
}
下面是在scf文件中引用过的源文件示意: "Startup.s"
code 32
area Vectors,CODE,READONLY
entry
...
end 注1:在"Startup.o"里面会生成名为"Vectors"的段,段的属性为"READONLY"
"Stack.s"
area Stacks, DATA, NOINIT
export StackUsr
StackUsr SPACE 1
end 注2: 在"Stack.o"里面会生成名为"Stacks"的段,段的属性为"NOINIT",该属性对应scf文件中的"+ZI". 该段不需要初始化或者可以被初始化为"0".
"Heap.s"
area Heap,DATA,NOINIT
export bottom_of_heap
bottom_of_heap SPACE 1
end 注3: "Heap.o"里面名为"Heap"的段。
在Scatter文件中最好每一个Region都加一个Maximum参数,这样当编译时如果实际使用的空间大于Maximum Size,会有Error:16220E: Excution region xxx size (xxx bytes) exceeds limit (xx bytes)。如果地址有重复,会有Error: 16221E: Excution region xxx overlaps with excution region xxx。前一个Region的首地址 + Maximum > 后一个Region的首地址时不一定有Error。只有当一分配的内存出现覆盖时才会有Error。
Region的"UNINIT"之类的参数要放在"Maximum size"参数之前。 |
|