Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1049933
  • 博文数量: 178
  • 博客积分: 10222
  • 博客等级: 上将
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-03 11:27
个人简介

有所追求

文章分类

全部博文(178)

文章存档

2012年(1)

2011年(5)

2010年(3)

2009年(78)

2008年(91)

我的朋友

分类:

2009-03-13 23:15:14

谢谢您的推荐

;转载请写明作者及出处-木瓜老C

;总共三个分散加载文件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, NOINITUNINIT 表示不初始化
    STACKS 0x40004000 UNINIT
    {
        Startup.o (Stacks)
    }
;外部RAM0x80000000开始为变量区

;如果片外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

阅读(1196) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~