zoukankan      html  css  js  c++  java
  • 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

     

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

  • 相关阅读:
    (Good Bye 2019) Codeforces 1270B Interesting Subarray
    (Good Bye 2019) Codeforces 1270A Card Game
    Codeforces 1283D Christmas Trees(BFS)
    Codeforces 1283C Friends and Gifts
    Codeforces 1283B Candies Division
    1095 Cars on Campus (30)
    1080 Graduate Admission (30)
    1099 Build A Binary Search Tree (30)
    1018 Public Bike Management (30)
    1087 All Roads Lead to Rome (30)
  • 原文地址:https://www.cnblogs.com/wenziqi/p/2358349.html
Copyright © 2011-2022 走看看