ADS下的分散加载文件应用实例

 http://blog.21ic.com/user1/2560/archives/2006/13874.html

ADS下的分散加载文件应用实例

load_region_name  start_address | "+"offset  [attributes] [max_size]
{
    execution_region_name  start_address | "+"offset  [attributes][max_size]
    {
        module_select_pattern  ["("
                                    ("+" input_section_attr | input_section_pattern)
                                    ([","] "+" input_section_attr | "," input_section_pattern)) *
                               ")"]
    }
}

加载区(load_region):指用来保存永久性数据(程序和只读变量)的区域;
执行区(execution_region):程序执行时所表现出来的区域;程序执行时,从加载区域将数据复制到执行区;

load_region_name(加载区域名): 用于Linker区别不同的加载区域,最多31个字符;
start_address:起始地址;
+offset:前一个加载区域尾地址+offset,做为当前的起始地址,且offset为0或4的倍数;
attributes:    PI       与地址无关
                RELOC    重新部署
                OVERLAY  覆盖,允许多个可执行区域在同一个地址,ADS不支持
                ABSOLUTE 绝对地址(默认)
max_size:该加载区域的大小;

execution_region_name:执行区域名;
start_address:链接是目标存放的地址,必须字对齐;
+offset:同上;
attributes:    PI      与地址无关
                OVERLAY  覆盖
                ABSOLUTE 绝对地址(默认)
                FIXED    固定地址
                UNINIT   不用初始化该区域的ZI段

module_select_pattern:目标文件滤波器,支持通配符“*”和“?”;*.o匹配所有目标,* (或“.ANY”)匹配所有目标文件和库。
input_section_attr:每个input_section_attr必须跟随在“+”后;且大小写不敏感;
            RO-CODE或CODE
            RO-DATA或CONST
            RO或TEXT, selects both RO-CODE and RO-DATA
            RW-DATA
            RW-CODE
            RW或DATA, selects both RW-CODE and RW-DATA
            ZI或BSS
            ENTRY, that is a section containing an ENTRY point.
            FIRST,用于指定存放在一个执行区域的第一个或最后一个区域
            LAST,同上
input_section_pattern:段名;

汇编中指定段:
     AREA    vectors, CODE, READONLY
C中指定段:
#pragma arm section [sort_type[[=]"name"]] [,sort_type="name"]*
sort_type:  code
            rwdata
            rodata
            zidata
如果“sort_type”指定了但没有指定“name”,那么之前的修改的段名将被恢复成默认值。
#pragma arm section将恢复所有段名为默认值。

一般应用:
#pragma arm section rodata = "sram", code ="sram"
.此间的“rodata”和“code”将定位在“sram”段中。
#pragma arm section


程序中对某区域的引用方法:
Load$$region_name$$Base             Load address of the region.
Image$$region_name$$Base            Execution address of the region.
Image$$region_name$$Length          Execution region length in bytes (multiple of 4).
Image$$region_name$$Limit           Address of the byte beyond the end of the execution region.

Image$$region_name$$ZI$$Base        Execution address of the ZI output section in this region.
Image$$region_name$$ZI$$Length      Length of the ZI output section in bytes (multiple of 4).
Image$$region_name$$ZI$$Limit       Address of the byte beyond the end of the ZI output sectionin the execution region.

SectionName$$Base                   Input Address of the start of the consolidated section called SectionName.
SectionName$$Limit                  Input Address of the byte beyond the end of the consolidated section called SectionName.
Base:首地址;
Limit:尾地址;
region_name:RO、RW、ZI、load_region_name、execution_region_name;

例如:
RAM1区域的首地址:Image$$RAM1$$Base
sram段首地址: sram$$Base
注意:“sram$$Base”不一定等于“Image$$RAM2$$Base”;


实例:
      起始地址      大小
ROM:  0x00000000    256K     0x1fc 保留为加密字
RAM   0x40000000     16K
SRAM  0x80000000    512K
程序在ROM中运行;
RAM主要用于程序堆栈及优先用于存放部分变量;
SRAM速度慢,主要用于存放大的数据表。

LOAD_ROM1 0x00000000                        ; 指定该加载区域首地址
{
    EXEC_ROM1  +0  0x1f8                    ; 没有前一加载区域,所以该执行区域首地址为加载去首地址
                                            ; 并指定该区域长度
    {
        Startup.o (vectors, +FIRST)         ; 目标文件的vectors段放在该执行区域的第一段
        irq.o (+RO)                         ; 目标文件的所有 RO段放在该执行区域
        swi.o (+RO)
    }
}

LOAD_ROM2 0x00000200                        ; 第二个加载区域
{
    EXEC_ROM2  +0  0x3e600
    {
        * (+RO)                             ; 所有目标文件和库文件中的 RO段存放在该区域
    }

    RAM1   0x40000000   0x4000
    {
        * (+RW, +ZI)                        ; 所有目标文件和库文件的 RW和 ZI段存放在该区域
    }

    SRAM2  0x80000000  0x80000
    {
        * (sram)                            ; 所有目标文件中的 sram段存放在该区域
    }
}

实例二:
Load_region1  0x00000000  0x1fc
{
    EXEC_ROM1  +0
    {
        Startup.o (vectors, +FIRST)
        irq.o (+RO)
    }
}

Load_region2  0x00000200 0x3e600
{
    EXEC_ROM2  +0
    {
        * (+RO)
    }

    Exec_RAM1  0x40000000  OVERLAY 0x4000       ; 覆盖,所以必须自己初始化RW和ZI区域
    {
        * (+RW, +ZI)
    }

    Exec_IAP   0x40000000  OVERLAY  0x80000     ; 覆盖,所以执行前应该COPY到执行区
    {
        iap.o (+RO)
    }
}
此例中iap.o定义在 RAM中运行,在调用iap.c中函数之前应该将其从Load$$region_name$$Base复制到Image$$region_name$$Base区域,而在系统启动前也应该将RW和ZI初始化好(__main不无效了)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值