简单应用时可以不写.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"参数之前。 本文来自:我爱研发网(52RD.com) - R&D大本营 详细出处:http://www./bbs/dispbbs.asp?boardid=118&id=70812&replyID=68709 |
|
来自: 昵称2187025 > 《linux c语言》