;总共三个分散加载文件mem_a.scf,mem_b.scf,mem_c.scf,区别是加载地址不一样
;具体加载哪个,在DebugInExram->ARM Linker->Scatter定义,链接类型选择Scattered
;image entry point一定要跟ROM_LOAD值一样
;ROM_LOAD 为加载区的名称,其后面的0x00000000 表示加载区的起始地址(存放程序代码的起始地址) ROM_LOAD 0x0 { ;ROM_EXEC 描述了执行区的地址,放在第一块位置定义 ROM_EXEC 0x00000000 { ;从起始地址开始放置向量表(即Startup.o(vectors, +First),其中Startup.o 为Startup.s 的目标文件)
;+First表示Vector段放在最前面 Startup.o (vectors, +First) ;接着放置其它代码(即* (+RO)),* 是通配符,类似WINDOW下搜索用的通配符 * (+RO) } ;变量区IRAM 的起始地址为0x40000000 IRAM 0x40000000 { ;放置Startup.o (MyStacks) Startup.o (MyStacks) } ;+0表示接着上一段,UNINIT 表示不初始化 STACKS_BOTTOM +0 UNINIT { ;放置AREA StackBottom, DATA, NOINIT Startup.o (StackBottom) } ;接着从0x40004000 开始,放置 AREA Stacks, DATA, NOINIT,UNINIT 表示不初始化 STACKS 0x40004000 UNINIT { Startup.o (Stacks) } ;外部RAM从0x80000000开始为变量区
;如果片外RAM起始地址不为0x8000 0000,则需要修改mem_.scf文件 ERAM 0x80000000 { * (+RW,+ZI) } ;+0表示接着上一段,UNINIT 表示不初始化 HEAP +0 UNINIT { ;放置堆底, AREA Heap, DATA, NOINIT Startup.o (Heap) } ;接着在外部0x80080000 放置堆顶
;这个地址是片外RAM 的结束地址,根据实际情况修改 HEAP_BOTTOM 0x80080000 UNINIT { Startup.o (HeapTop) } }
;重定向__user_initial_stackheap 函数
;分配新的bottom_of_heap地址等,R0-R3是函数必须的返回值,返回bottom_of_heap的值
;通过分散加载描述文件,重定向其位置,bottom_of_heap等已经在Startup.s中定义为DATA类型
__user_initial_stackheap LDR r0,=bottom_of_heap ; LDR r1,=StackUsr LDR r2,=top_of_heap LDR r3,=bottom_of_Stacks MOV pc,lr
|