1.分散加载描述是将代码和数据与最适合的内存类型进行匹配(例如,可以将中断代码放入快速SRAM中以改善中断响应时间,但不常使用的配置信息可能会放入较慢的闪存中。)
2.用符号来标识堆和堆栈
在ARM ® C库提供了函数的多个实现 __user_setup_stackheap(),可以通过分散文件中给出的信息自动选择正确的给你
若要指定 只能在ARM_LIB_STACK 及ARM_LIB_HEAP 中定义。
LOAD_FLASH …
{
…
ARM_LIB_STACK 0x40000 EMPTY -0x20000 ; Stack region growing down
{ }
ARM_LIB_HEAP 0x28000000 EMPTY 0x80000 ; Heap region growing up
{ }
…
}
3.内存映射外设
4.功能在一个恒定的位置
将目标文件中的段加载到内存中
LOAD_ROM 0x0000 0x8000; 负荷区域(LOAD_ROM)的名称,
; 开始地址为负载区域(0×0000),
; 最大加载区大小(0x8000)
{
EXEC_ROM 0x0000 0x8000; 第一EXEC区域(EXEC_ROM)的名称,
; 对于EXEC区域(0×0000)开始的地址,
; 第一个exec区域的最大大小(0x8000)
{
*(+ RO); 将所有代码和RO数据放入
; 这个exec区域
}
SRAM 0x10000 0x6000; 第二个exec区域(SRAM)的名称,
; 第二个exec区域的起始地址(0x10000),
; 第二个exec区域的最大大小(0x6000)
{
*(+ RW,+ ZI); 将所有RW和ZI数据放入
; 这个exec地区
}
}
将program1.o和program2.o 文件中的段加载到内存中:
LOAD_ROM_1 0x0000; 第一个加载区的起始地址(0x0000)
{
EXEC_ROM_1 0x0000; 第一个exec区域的起始地址(0x0000)
{
program1.o(+ RO); 放置所有代码和RO数据
; program1.o进入这个exec区域
}
DRAM 0x18000 0x8000; 该exec区域的起始地址(0x18000),
; 此exec区域的最大大小(0x8000)
{
program1.o(+ RW,+ ZI); 放置所有RW和ZI数据
; program1.o进入这个exec区域
}
}
LOAD_ROM_2 0x4000; 第二个加载区的起始地址(0x4000)
{
EXEC_ROM_2 0x4000
{
program2.o(+ RO); 放置所有代码和RO数据
; program2.o进入这个exec区域
}
SRAM 0x8000 0x8000
{
program2.o(+ RW,+ ZI); 放置所有RW和ZI数据
; program2.o进入这个exec区域
}
}
如果要连接其他的模块 需要使用* 或.ANY 说明符来放置其余的代码和数据
scatter 文件链接到二进制
FLASH_LOAD 0x20000000
{
RW 0x20000000; 位带区域起始处的RW数据
{
*(+ RW-DATA)
}
RO +0 FIXED; 其次是RO数据
{
*(+ RO-DATA)
}
CODEDATA +0; 其他一切都是
{
*(+ RO-CODE)
*(+ ZI); ZI在
}
ARM_LIB_HEAP +0 EMPTY 0x10000 之后直接跟随; 堆启动之后
{
}
ARM_LIB_STACK 0x20100000 EMPTY -0x10000; 堆栈开始于
; 位带区域顶部
{
}
}