手机开发实战183——Scatter file介绍4

来源:互联网 发布:淘宝描述不符退款 拆解 编辑:程序博客网 时间:2024/06/04 19:25

Scatterloading 文件是ARM 的工具链里面的一个特性,作为程序编译过程中

给连接器使用的一个参数,用来指定最终生成的目标映像文件运行时的分布状态。

 

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
,同上;

程序代码可以分成三部分:

RO是程序中的指令和常量就是readonly

RW是程序中的已初始化变量就是read/write

ZI是程序中的未初始化的变量就是zero

 


input_section_pattern:段名;

汇编中指定段:
     AREA    vectors, CODE, READONLY
C
中指定段:
#pragma arm section [sort_type[[=]"name"]] [,sort_type="name"]*
sort_type:      code
rwdatarodatazidata
                
如果“sort_type”指定了但没有指定“name”,那么之前的修改的段名将被恢复成默认值。
#pragma arm section     // 
恢复所有段名为默认设置。
应用:
    #pragma arm section rwdata = "SRAM",zidata = "SRAM"
        static OS_STK  SecondTaskStk[256];              // “rwdata”“zidata”
将定位在“sram”段中。
    #pragma arm section                                 // 
恢复默认设置

 

可以将代码放在CPU自带的RAM中,以加快运行速度,如以下指令:

#pragma arm section code = "INTERNCODE"

#pragma arm section rwdata = "INTERNRW" , rodata = "INTERNCONST" , zidata = "INTERNZI"

0 0
原创粉丝点击