鸿 网 互 联 www.68idc.cn

ADS分散加载(一)

来源:互联网 作者:佚名 时间:2015-10-09 05:44
ADS 分散 加载文件语法: ;加载域书写式:加载域名称 起始地址 属性(可省略) 最大长度(可省略) ; ;加载域起始地址:可以使用绝对地址和偏移地址 ;加载域属性:ABSOLUTE:绝对地址,默认属性,不允许加载域互相重叠 ; PI:位置无关,允许加载域互相重叠 ; REL
ADS分散加载文件语法:

;加载域书写格式:加载域名称 起始地址 属性(可省略) 最大长度(可省略)
;
;加载域起始地址:可以使用绝对地址和偏移地址
;加载域属性:ABSOLUTE:绝对地址,默认属性,不允许加载域互相重叠
;            PI:位置无关,允许加载域互相重叠
;            RELOG:重定位,允许加载域互相重叠,执行域没有本属性但可以继承加载域的属性
;            OVERLAY:覆盖,允许加载域互相重叠,可以在相同地址上建立多个执行域,ADS不支持本属性
;加载域包含1个或多个执行域

;执行域书写格式:执行域名称 起始地址 属性(可省略) 最大长度(可省略)
;
;执行域起始地址:可以使用绝对地址和偏移地址,使用偏移地址(要求可以被4整除的数)的执行域不能指定属性
;执行域属性:ABSOLUTE:绝对地址,默认属性,不允许执行域互相重叠
;            FIXED:固定地址,加载和执行都是同一地址,必须使用绝对地址或0偏移地址
;            PI:位置无关,允许执行域互相重叠
;            OVERLAY:覆盖,允许执行域互相重叠
;            UNINIT:未初始化,ZI段将不会被初始化为0,仅仅保留了内存单元,而没有将各初始写入内存单元,或者将内存单元初始化为0

;执行域包含1个或多个输入段

;输入段书写格式:包括模块描述和段描述
;
;模块描述:指定包含模块的文件(包括目标文件.o和库文件.LIB)搜索范围,可以使用通配符*和?
;          *.o(所有目标文件)
;          *(所有目标文件和库文件)
;          .ANY(所有文件)不论放在文件哪个位置,本描述被最后解析,相当于“剩下的所有文件”
;模块:汇编用AREA声明的段,例如AREA StackBottom, DATA, NOINIT
;      C中指定段:#pragma arm section rwdata = "SRAM",zidata = "SRAM"
;
;段描述:包括属性描述和段名描述
;
;属性描述:(+ 属性)
;          RO:只读代码段+数据段,也可表达为TEXT
;          RO-CODE:只读代码段
;          RO-DATA:只读数据段
;          RW:读写代码段+数据段,也可表达为DATA
;          RW-CODE:读写代码段
;          RW-DATA:读写数据段
;          ZI:初始化为0的数据段,也可表达为BSS
;          ENTRY:包含入口点的输入段
;伪属性:FIRST:放在最前
;        LAST:放在最后
;
;段名描述:(输入段名)只能用在汇编语言中


;周立功的例程总共三个分散加载文件mem_a.scf,mem_b.scf,mem_c.scf,区别是加载地址不一样
;具体加载哪个,在DebugInExram->ARM Linker->Scatter定义,链接类型选择Scattered

ROM_LOAD 0x0                         ;ROM_LOAD 为加载域的名称,其后面的0x0 表示加载域的起始地址(存放程序代码的起始地址)
                                     ;image entry point一定要跟ROM_LOAD值一样
{
    ROM_EXEC 0x00000000              ;ROM_EXEC 描述了执行域的地址,放在第一块位置定义
    {
        Startup.o (vectors, +First) ;从起始地址开始放置向量表(Startup.o 为Startup.s 的目标文件)
                                     ;+First表示Vector段放在最前面

        * (+RO)                      ;接着放置其它代码(* 是通配符,类似WINDOW下搜索用的通配符)
    }

    IRAM 0x40000000                  ;变量域IRAM ,内部RAM的起始地址为0x40000000
    {

        Startup.o (MyStacks)         ;放置Startup.o (MyStacks)
    }

    STACKS_BOTTOM +0 UNINIT          ;+0表示接着上一段,UNINIT 表示不初始化
    {

        Startup.o (StackBottom)      ;放置AREA StackBottom, DATA, NOINIT
    }

    STACKS 0x40004000 UNINIT         ;接着从0x40004000 开始,放置 AREA Stacks, DATA, NOINIT UNINIT 表示不初始化
    {
        Startup.o (Stacks)
    }

    ERAM 0x80000000                  ;外部RAM从0x80000000开始为变量域
                                     ;如果片外RAM起始地址不为0x8000 0000,则需要修改mem_.scf文件
    {
        * (+RW,+ZI)
    }
    HEAP +0 UNINIT                   ;+0表示接着上一段,UNINIT 表示不初始化
    {
        Startup.o (Heap)             ;放置堆底, AREA Heap, DATA, NOINIT
    }
    HEAP_BOTTOM 0x80080000 UNINIT   ;接着在外部0x80080000 放置堆顶
                                    ;这个地址是片外RAM 的结束地址,根据实际情况修改
    {
        Startup.o (HeapTop)
    }
}

“PI” 属性使用示例:
LR_1 0x010000 PI                 ; 加载域起始地址0x010000.
{
     ER_RO +0                    ; 执行域从加载区继承PI属性
                                 ; 默认执行域起始地址是0x010000, 在此处可以被移动
     {
         *(+RO)                  ; 所有RO段.
     }
     ER_RW +0 ABSOLUTE           ; PI属性被ABSOLUTE取代
     {
         *(+RW)                  ; RW被紧接着放置,不能移动
     }
     ER_ZI +0                    ; ER_ZI执行域在ER_RW执行域后面
     {
         *(+ZI)                  ; 所有ZI段被连续放置
     }
}

LR_1 0x010000                    ; 加载域起始地址0x010000.
{
     ER_RO +0                    ; 执行域从加载区继承ABSOLUTE属性
                                 ; 默认执行域起始地址是0x010000, 在此处不能移动
     {
         *(+RO)                  ; 所有RO段.
     }
     ER_RW 0x018000 PI           ; PI属性取代ABSOLUTE
     {
         *(+RW)                  ; RW被放置在0x018000,在此处可以被移动
     }
     ER_ZI +0                    ; ER_ZI执行域在ER_RW执行域后面
     {
         *(+ZI)                  ; 所有ZI段被连续放置
     }
}

网友评论
<