Scatterfile 讲解 (转)

    零零散散的看了不少关于分散加载文件的文章,感觉大家好像都不是很明白。今天总结一下,虽不算全面,但希望能为后来者

带来帮助!
    分散加载(Scatlerloading),即工程里的.scf文件。在scatterfile中可以为每一个代码或数据区在装载和执行时指定不同的

存储区域地址,Scatlertoading的存储区块可以分成二种类型:

    装载区:当系统启动或加载时应用程序的存放区。
    执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统
            在实时运行时可以有一个或多个执行块。

    映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。

1.scatter文件语法:
    scatter文件是一个简单的文本文件,包含一些简单的语法。
My Region 0x0000 0x1000
{
;the context of region
}

标题:
    每个块由一个头标题开始定义,头中至少包含块的名字(自己定义)和起始地址,如0x0000,另外还有最大长度等其他一些属

性选项(注:这些属性是可选的,如0x1000)

内容:
    块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。
    一个加载块(加载时域)必须至少含有一个执行块(运行时域);实践中通常有多个执行块。
    一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中

所有没有在文件中定义的余下部分。

2.分散加载样例分析:
    这里用周立功的开发板附带例程里的分散加载文件做例子进行讲解。
    硬件配置:
        内部 64K RAM: 0x4000 0000  - 0x4000 ffff
        外部 2M FLASH:0x8000 0000  - 0x801f ffff
        外部 8M RAM:  0x8100 0000  - 0x807f ffff

ROM_LOAD 0x80000000    ;加载时域描述
{
    ROM_EXEC 0x80000000    ;第一个运行时域描述
    {
        Startup.o (vectors, +First)   ;输入段描述:模块startup位于该
                                      ;域的开头(+First),vector为入口点
        * (+RO)    ;本域包含全部RO代码(*(+RO))
    }

    IRAM 0x40000000    ;第二个运行时域:将堆栈空间放入
                       ;片内静态RAM中(0x40000000)
    {
        Startup.o (MyStacks)    ;本域包含模块STARTUP 的MYSTACKS段
    }

    STACKS_BOTTOM +0 UNINIT ;将栈底放在堆栈的后面(+0)
                            ;不进行初始化(UNINIT)
    {
        Startup.o (StackBottom)
    }

    STACKS 0x40004000 UNINIT ;将STACKS放入40004000 此处地址不能访问
                             ;如访问将产生预取中止和数据中止异常
    {
        Startup.o (Stacks)                        
    }

    ERAM 0x81000000    ;将所有RWZI(*(+RW,+ZI))段放入外部RAM中
    {
        * (+RW,+ZI)
    }

    HEAP +0 UNINIT    ;在RWZI段后放入堆底
    {
        Startup.o (Heap)
    }

    HEAP_BOTTOM 0x81080000 UNINIT
    {
        Startup.o (HeapTop)    ;堆顶:放入了外部RAM中(0x81080000)
    }
}

(1)样例中,只有一个加载块ROM_LOAD,包含了所有的代码和数据(存放在ROM),起始地址为0x800000000。这个加载块一共对应七

个执行块(ROM_EXEC, IRAM,STACKS_BOTTOM, STAKS,ERAM,HEAP,HEAP_BOTTOM)。
(2)RO的代码和数据会从ROM_EXEC开始执行,执行地址与装载地址相同。
(3)Startup.o是Startup.s的目标文件(Startup.s也在这个工程下),vectors是在Startup.s定义的段,整个句子的意思是把整个

Startup.s编译生成的目标文件(向量表)放在0x8000 0000的第一个位置,即从vectors开始依次从ROM_EXEC的顶部放下来。
(4)所有的RW和ZI数据包含在外部RAM执行块里,起始地址为0x81080000。
(5)RW数据是从ROM_LOAD copy 过来的,ZI数据是在RAM中初始化的,其位置在RW之上。
(6)HEAP是用来定位堆栈的底的,堆栈底的位置在ZI之上所以使用"+0",heap会从此地址增加。
(7)STACKS是用来定位堆栈顶的,堆栈顶的位置在可以用来作为存储的内存的顶部。Stacks会从堆栈顶的地址下降。

转载于:https://www.cnblogs.com/xtrgm623/archive/2008/10/31/1323466.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值