• 19.6 scatter文件


    一个映像文件里可以包含多个域(region),它们在装载和运行时可以有不同的地址。这个地址可以用armlink的两个参数来确定:

    ro-base 设置代码段(RO)在装载域(load view)和运行域(execution view)里的地址。

    rw-base 设置数据段(RW)在运行域里的地址。

    实际上,当域的内存映射关系比较简单时,可以使用这两个参数,但它们不能处理更为复杂的内存映射(memeory map),在这种情况下,就要用分散装载(scatter loading)技术。

    分散装载技术可以把应用程序分割成多个RO域和RW域,并且给它们指定不同的地址。这在嵌入式的实际应用中,有很大好处。在一个嵌入式系统中,Flash16RAM32RAM都可能存在于系统中,所以,将不同功能的代码定位在特定的位置大大地提高系统的效率。下面是最为常用的两种情况:

    第一种情况:32位的RAM速度最快,那么就把中断程序作为一单独的运行域,放在32位的RAM中,使它的响应时间缩到最短,这在startup_M051.s文件中有体现。

    第二种情况:将启动代码(bootloader)以外的所有代码都复制到RAM中运行。

    那么,分散装载是如何实现的呢?它通过一个文本文件作为armlink的参数来实现,文件里描述了分散装载需要的两个信息。

    ① 如何分散,就是输入段如何组成输出段和域:分组信息

    ② 如何装载,就是装载域和每个运行域的地址是多少:定位信息

     

    19.6.1 scatter文件简介

    Scatter文件是一个文本文件,它描述了装载域和运行域的基本属性。

     

    一、对装载域的描述

     

    scatter文件里,描述了装载域的名字、起始地址、最大尺寸、属性和运行域集合。其中最大尺寸和属性是可选的。如下例M051Simple.scf所示:

     

    程序清单19.6-1 M051Simple.scf装载域

    LR_IROM1 0x00000000  

    {    

      ER_IROM1 0x00000000   

      {  

       *.o (RESET, +First)

       *(InRoot$$Sections)

       .ANY (+RO)

      }

     

      RW_IRAM1 0x20000000   

      {  

       .ANY (+RW +ZI)

      }

    }

     

    在上面的scatter文件里,装载域的名字为LR_IROM1,起始地址为0x00000000,包含两个运行域:ER_IROM1RW_IRAM1。编写好这个scatter文件后,就可以作为armlink的参数来使用它。

     

    二、对运行域的描述

    scatter里,描述了运行域的名字、起始地址、最大尺寸、属性和输入段的集合,如下例所示:

     

    程序清单19.6-2 M051Simple.scf运行域

    LR_IROM1 0x00000000 0x2000  

    {    

      ER_IROM1 0x00000000 0x2000  

      {  

       *.o (RESET, +First)

       *(InRoot$$Sections)

       .ANY (+RO)

      }

     

      RW_IRAM1 0x20000000 0x1000  

      {  

       .ANY (+RW +ZI)

      }

     

     FLASH1 0x800 0x1F0

     {

        FLASH1 +0

        {

             Led1Ctrl.o

        }

     }

     

     FLASH2 0x1000 0xFF0

     {

        FLASH2 +0

        {

             Led7Ctrl.o

        }

     }

    }

     

    在这个文件里描述了两个运行域,分别为FLASH1 FLASH2FLASH1的起始地址为0x800,长度为0x1F0Led1Ctrl.o里的所有代码和只读数据都放在这个运行域里,FLASH2亦然。

     

    三、对输入段的描述

    scatter文件里,描述了输入段的模块名字(比如目标文件名)和输入段的属性(RORWZI等)。比如:uart.o+ZI),其中,uart.o为模块名;+ZI为输入段的属性。模块名字可以用通配符号,比如:*“*+RO+RW+ZI表示所有的代码和数据段。

     

     

    ………………………………………………

     

    书籍下载地址(复制到下载工具进行下载):

     

    https://files.cnblogs.com/wenziqi/ARMCortex-M0原理与应用实践.part1.rar

     

    https://files.cnblogs.com/wenziqi/ARMCortex-M0原理与应用实践.part2.rar

     

    注:书籍内容会不定期进行更新!

  • 相关阅读:
    JSOI2015 总结
    JSOI2014 总结
    JSOI2010/2011 总结
    1.13 考试总结
    1.15 考试总结
    [SDOI2015]寻宝游戏
    [教程]视频网课如何打开倍速纵享丝滑
    对机器学习的一些理解【学术篇】
    angular JS 路由功能
    理解 $scope
  • 原文地址:https://www.cnblogs.com/wenziqi/p/2358349.html
Copyright © 2020-2023  润新知