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

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、付费专栏及课程。

余额充值