armlink - Scatter file文件格式

Scatter file (分散加载描述文件)用于armlink的输入参数,他指定映像文件内部各区域的download与运行时位置。Armlink将会根据scatter file生成一些区域相关的符号,他们是全局的供用户建立运行时环境时使用。 
(注意:当使用了scatter file 时将不会生成以下符号:
Image$$RW$$Base,
Image$$RW$$Limit,
Image$$RO$$Base,
Image$$RO$$Limit,
Image$$ZI$$Base,
Image$$ZI$$Limit)
分散加载(Scatlerloading),即工程里的.scf文件。在scatterfile中可以为每一个代码或数据区在装载和执行时指定不同的 存储区域地址,Scatlertoading的存储区块可以分成二种类型:
    装载区:当系统启动或加载时应用程序的存放区。 
    执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。

    映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。

1.scatter文件语法:
    scatter文件是一个简单的文本文件,包含一些简单的语法。
My Region 0x0000 0x1000 

;the context of region 
}

标题: 
    每个块由一个头标题开始定义,头中至少包含块的名字(自己定义)和起始地址,如0x0000,另外还有最大长度等其他一些属
性选项(注:这些属性是可选的,如0x1000)

内容:
    块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。 
    一个加载块(加载时域)必须至少含有一个执行块(运行时域);实践中通常有多个执行块。 
    一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中
所有没有在文件中定义的余下部分。

 

一个映像文件由域(region)、输出段(output sections)和输入段(input sections)组成。不要想得太复杂,其实他们之间就是包含与被包好的关系。具体关系是这样的:

  映像文件 >   域 >  输出段 >  输入段

  输入段:

  输入段就是我们写的代码+初始化的数据+应该被初始化为0的数据+没有初始化的数据,用英文表示一下就是:RO(ReadOnly),RW (ReadWrite),ZI(ZeroInitialized),NOINIT(Not Initialized)。ARM连接器根据各个输入段不同的属性把相同的拿再一起组合一下就成为了输出段。

  请看看平时写的东东:

  AREA    RESET, CODE, READONLY

  AREA    DSEG1, DATA, READWRITE

  AREA    HEAP, NOINIT, READWRITE

  看出其属性没?

  输出段:

  为了简化编译过程和更容易取得各种段的地址,那么把多个同属性的输入段按照一定的规律组合在一起,当然这个输出段的属性就和它包含的输入段的属性一样咯。输入段的排放规律就是:最先排放RO属性的输入段,然后是RW属性段,最后是ZI或NOINIT段。

  域:       

  为什么还要加一层域,我的理解是由于代码的功能不同,那么我们有必要把不同功能的代码分类放。我们可以把需要高速执行的代码放在一起、把对速度 要求不高的放在一起、把执行频率高的放在一起,把执行频率低的放在一起...那么按照这种方式放的代码就可以根据其具体需要放在不同的存储器中了。这样可 以提高程序执行速度。一个域中包含1~3个输出段。

  映像文件:

  我暂时把映像文件理解成烧到存储器中的文件,由N个域组成。这些域其实可以看做是独立的模块,只是他们按照一定的顺序(这个顺序还是:RO+RW+ZI)被捆绑在一起,这样才方便烧写到非易失存储器中去。

  好了,了解了映像文件的组成,那么来看看映像文件是怎么跑起来的。

  映像文件就是有N节车厢的火车,车厢(域)里装着要送到不同站(不同类型的存储器)的货物。到相应的站了,那么就把相应的车厢拿下来。指挥拿这 个的就是scatter文件。拿下货物车厢后,我们就解开它,把里面的品牌为RO的货物提取出来,按照scatter的指示发给某个地址,然后再先后把品牌为RW和ZI的货物发到scatter指定的地址。

 

二 什么时候使用scatter file
当然首要的条件是你在利用ADS进行项目开发,下面我们看看更具体的一些情况。
1 存在复杂的地址映射:例如代码和数据需要分开放在在多个区域。
2 存在多种存储器类型:例如包含 Flash,ROM,SDRAM,快速SRAM。我们根据代码与数据的特性把他们放在不同的存储器中,比如中断处理部分放在快速SRAM内部来提高响应速度,而把不常用到的代码放到速度比较慢的Flash内。
3 函数的地址固定定位:可以利用Scatter file实现把某个函数放在固定地址,而不管其应用程序是否已经改变或重新编译。
4 利用符号确定堆与堆栈:
5 内存映射的IO:采用scatter file可以实现把某个数据段放在精确的地指处。
因此对于嵌入式系统来说scatter file是必不可少的,因为嵌入式系统采用了ROM,RAM,和内存映射的IO。
三 scatter file 实例
1 简单的内存映射
LOAD_ROM 0x0000 0x8000
{
       EXEC_ROM 0x0000 0x8000
       {
       *(+RO)
       }
      RAM 0x10000 0x6000
      {
       *(+RW, +ZI)
      }
}
LOAD_ROM(下载区域名称) 0x0000(下载区域起始地址) 0x8000(下载区域最大字节数)
{
        EXEC_ROM(第一执行区域名称) 0x0000(第一执行区域起始地址) 0x8000(第一执行区域最大字节数)
       {
       *(+RO(代码与只读数据))
       }
      RAM(第二执行区域名称) 0x10000(第二执行区域起始地址) 0x6000(第二执行区域最大字节数)
      {
       *(+RW(读写变量), +ZI(未初始化变量))
      }
}
2 复杂内存映射
LOAD_ROM_1 0x0000
{
       EXEC_ROM_1 0x0000
       {
        program1.o(+RO)
       }
      DRAM 0x18000 0x8000
      {
       program1.o (+RW, +ZI)
      }
}
LOAD_ROM_2 0x4000
{
       EXEC_ROM_2 0x4000
       {
       program2.o(+RO)
       }
       SRAM 0x8000 0x8000
      {
       program2.o (+RW, +ZI)
      }
}
 
LOAD_ROM_1 0x0000(下载区域一起始地址)
{
       EXEC_ROM_1 0x0000(第一执行区域开始地址)
       {
        program1.o(+RO) (program1.o内的Code与RO data 放在第一执行区域)
       }
       DRAM 0x18000(第二执行区域开始地址) 0x8000(第二执行区域最大字节数)
      {
       program1.o (+RW, +ZI) (program1.o内的RW
  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值