分散加载(7)---输入节input section

一、输入节构成

输入节由两部分组成:module_select_pattern,input_section_selector。可以有多个input_section_selector,用逗号隔开。input_section_selector又由几个部分组成构成:

"+" input_section_attr,input_section_pattern,input_section_type,input_symbol_pattern

,section_properties。 如图:

 

 

一定要用一对小括号( )把input section selector包括起来,跟在module select pattern后面。

分散加载(7)---输入节input section_第1张图片 

 

 

二、输入节的语法

  input_section_description ::=

        module_select_pattern [ "(" input_section_selector ( "," input_section_selector )* ")" ]

input_section_selector ::= "+" input_section_attr

        | input_section_pattern

        | input_section_type

        | input_symbol_pattern

        | section_properties

三、输入节说明

  输入节的核心思想就是:从一大堆obj文件,库文件中找出目标对象,放到期望的存储器位置中。举个简单的例子来说,我要从一个文件A中找出字符串“test string”,那个文件A就是module_select_pattern, 字符串“test string”就是input_section_selector。 我们可以把module_select_pattern看作一个匹配器,指定需要匹配的范围,把input_section_selector看作选择器,指定需要匹配的内容。下面逐一具体解释module_select_pattern 和 input section selector。

3.1关于module select pattern(勉强范围为:模块匹配器)

  用来匹配查找的范围,范围一般是整个工程中的object文件(*.o),库文件,库文件名称,等。可以使用通配符*/?来指定适配范围,通配符*匹配零个或多个字符,通配符?匹配任何单个字符。举例说明常用的几种module select pattern 写法:

❊ * 匹配所有的object文件和库文件;

❊ *.o 匹配所有的object文件;

“file one.o”匹配特定的object文件:file one.o,注意这里由于file one之间有空格,所以需要用“”。 

*libname.lib 匹配以libname.lib结尾的所有库;

.ANY 匹配所有的object文件和库文件,类似*,但是*的优先级高于.ANY。

特殊说明:

  1. 不可以同时使用两个*在一个输入节中;
  2. 通配符*和.ANY的区别:*的优先级高于.ANY。*不会跨RAM块分配空间。比如,你定义了一个128K的大数组,然后,你定义了在两个执行域,每个执行域中指定了一块RAM空间。然后把这个大数据分配到这两个执行域的RAM空间中,如果用.ANY指定分配空间,第一个执行域RAM空间放不下会自动分配到第二个执行域的RAM空间。如果用*指定,如果超出了第一个执行域RAM空间大小,就会报警,此时不会自动分配到第二执行域的RAM空间。

3.2关于input section selector(勉强翻译为:输入节选择器)

  Input section selector放在一对小括号里面,这部分很复杂,共有5个部分的内容:"+" input_section_attr,input_section_pattern,input_section_type,input_symbol_pattern,section_properties。这5个部分并不是必须同时有,只要有一个就可以,当多于一个的时候,没有顺序关系,但是,+FIRST, +LAST应该放在最后。

3.2.1关于input_section_attr (属性选择器)

  input_section_attr定义了一些标准属性,可以把这些标准属性,作为期望的匹配内容。每个input_section_attr后面跟一个 “+”符号。

①属性选择器不区分大小写,可识别以下选择器:

RO-CODE.

RO-DATA.

RO, selects both RO-CODE and RO-DATA.

RW-DATA.

RW-CODE.

RW, selects both RW-CODE and RW-DATA.

XO.

ZI.

ENTRY, that is, a section containing an ENTRY point.

②可以识别以下同义词:

CODE for RO-CODE.

CONST for RO-DATA.

TEXT for RO.

DATA for RW.

BSS for ZI.

③可以识别以下伪属性:

FIRST.

LAST.

如果放置顺序很重要,请使用FIRST和LAST标记执行区域中的第一个和最后一个部分。例如,如果特定的输入部分必须在区域中的第一个,而包含校验和的输入部分则必须在最后。

注意:+FIRST必须放在一个选择器的后面,比如这样:*(section, +FIRST)。

有时候也写成+First,应该是一样的,属性选择器不区分大小写。

3.2.2关于input_section_pattern(怎么翻译?输入节适配器?)

  input_section_pattern可以使用使用通配符*/?,这个适配器是用来找出输入节名称的,比如在程序中定义了一些输入节名称:__attribute__((section(“ram_code_1”)), __attribute__((section(“ram_code_2”)), __attribute__((section(“ram_code_3”)), 那么可以使用ram_code*作为input_section_pattern,这样就可以把所有含有ram_code的输入节名称找出来,输入节对应的内容(代码或者数据)放到指定的存储器位置。

3.2.3关于input_section_type

  与输入节类型进行比较的数字。数字可以是十进制或十六进制。(干啥用的? 不知道。)

3.2.4关于input_symbol_pattern

  根据全局符号确定匹配内容。

3.2.5关于section_properties

  Section_properties 可以是+FIRST+LASTOVERALIGN值。

四、输入节举例

分散加载(7)---输入节input section_第2张图片 分散加载(7)---输入节input section_第3张图片

 

五、加载文件在map文件中的体现

  我们可以在MDK编译后的map文件中,清晰看到分散加载文件相关的内容。

分散加载(7)---输入节input section_第4张图片 

 

你可能感兴趣的:(SCATTER,FILE,物联网,单片机)