ILINK 根据 ILINK Configuration File (*.icf)来分配这些 sections。 由于 XLINK 与 ILINK 是两个完全不同的链接器, 所以 XCL 和 ICF 也是两种完全不同的配置文件。 下面简要介绍 ICF 文件的格式和内容, 以协助用户完成版本迁移。 2.4 ICF 格式浅析 sections 在地址空间中的存放是由 ILINK 链接器来实现的, 而 ILINK 链接器是按照用户在 ICF 文件中的规定来放置 sections 的, 所以理解 ICF 文件的内容尤其重要。 一个标准的 ICF 文件可包括下面这些内容: 1. 可编址的存储空间(memory) 2. 不同的存储器地址区域(region) 3. 不同的地址块(block) 4. Section 的初始化与否 5. Section 在存储空间中的放置 下 面 介 绍 了 几 条 ICF 文 件 中 常 见 的 指 令 , 详 细 内 容 请 参 考 ILINK 相 关 说 明 文 档(EWARM_DevelopmentGuide.pdf): define [ exported ] symbol name = expr; 作用: 指定某个符号的值。 参数: exported 导出该 symbol, 使其对可执行镜像可用 name 符号名 expr 符号值 举例: define symbol RAM_START_ADDRESS = 0x40000000; define symbol RAM_END_ADDRESS = 0x4000FFFF; define memory name with size = expr [, unit‐size]; 作用: 定义一个可编址的存储地址空间(memory)。 参数: name memory 的名称 expr 地址空间的大小 unit‐size expr 的单位, 可以是位(unitbitsize), 缺省是字节(unitbytesize) 举例: define memory MEM with size = 4G; define region name = region‐expr; 作用: 定义一个存储地址区域(region)。 一个区域可由一个或多个范围组成, 每个范围内地址必须连续, 但几个范围之间不必是连续的。 参数: name region 的名称 region‐expr memory:[from expr { to expr | size expr}], 可以定义起止范围, 也可以定义起始地址和 region 的大小 举例: define region ROM = MEM:[from 0x0 size 0x10000]; define region ROM = MEM:[from 0x0 to 0xFFFF]; define block name[ with param, param... ] { extended‐selectors }; 作用: 定义一个地址块(block); 它可以是个空块, 比如栈、 堆; 也可以包含一系列 sections。 参数: name block 的名称 param 可以是: size = expr (块的大小) maximum size = expr (块大小的上限) alignment = expr (最小对齐字节数) fixed order (按照固定顺序放置 sections) extended‐selector [ first | last ] { section‐selector | block name | overlay name } first 最先存放 last 最后存放 section‐selector [ section‐attribute ][ section sectionname ][object filename ] section‐attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ] sectionname section 的名称 filename 目标文件的名称 即可以按照 section 的属性, 名称及其所在目标文件的名称这三个过滤条件中, 任意选取一个条件, 或选取多个条件进行组合, 来圈定所要求的 sections。 name block 或 overlay 的名称 举例: define block HEAP with size = 0x1000, alignment = 4 { }; define block MYBLOCK1 = { section mysection1, section mysection2, readwrite }; define block MYBLOCK2 = { readonly object myfile2.o }; initialize { by copy | manually } [ with param, param... ] { section‐selectors }; 作用: 初始化 sections。 参数: by copy 在程序启动时自动执行初始化。 manually 在程序启动时不自动执行初始化。 param 可以是: packing = { none | compress1 | compress2 | auto } copy routine = functionname packing 表示是否压缩数据, 缺省是 auto。 functionname 表示是否使用自己的拷贝函数来取代缺省函数。 section‐selector 同上 举例: initialize by copy { rw }; do not initialize { section‐selectors }; 作用: 规定在程序启动时不需要初始化的 sections。 一般用于__no_init 声明的变量段(.noinit)。 参数: section‐selector 同上 举例: do not initialize { .noinit }; place at { address memory[: expr] | start of region_expr | end of region_expr } { extended‐selectors }; 作用: 把一系列 sections 和 blocks 放置在某个具体的地址, 或者一个 region 的开始或者结束处。 参数: memory memory 的名称 expr 地址值, 该地址必须在 memory 所定义的范围内 region_expr region 的名称 extended‐selector 同上 举例: place at start of ROM { section .cstart }; place at end of ROM { section .checksum }; place at address MEM:0x0 { section .intvec }; place in region‐expr { extended‐selectors }; 作用: 把一系列 sections 和 blocks 放置在某个 region 中。 sections 和 blocks 将按任意顺序放置。 参数: region‐expr region 的名称 extended‐selector 同上 举例: place in ROM { readonly }; place in RAM { readwrite }; place in RAM { block HEAP, block CSTACK, block IRQ_STACK }; place in ROM { section .text object myfile.o }; place in ROM { readonly object myfile.o }; place in ROM { readonly data object myfile.o }; IAR 中 ICF 文件分析与应用 sections 在地址空间中的存放是由 ILINK 链接器来实现的, 而 ILINK 链接器是按照用户在 ICF文件中的规定来放置 sections 的, 所以理 解 ICF 文件的内容尤其重要。 一个标准的 ICF 文件可包括下面这些内容: 1. 可编址的存储空间(memory) 2. 不同的存储器地址区域(region) 3. 不同的地址块(block) 4. Section 的初始化与否 5. Section 在存储空间中的放置 下 面介 绍 了 几 条 ICF 文 件中 常 见 的 指 令, 详 细 内 容 请参 考 ILINK 相 关 说 明 文档(EWARM_DevelopmentGuide.pdf): 1. define [ exported ] symbol name = expr; 作用: 指定某个符号的值。 参数: exported 导出该 symbol, 使其对可执行镜像可用 name ‐‐符号名 expr ‐‐符号值 举例: define symbol RAM_START_ADDRESS = 0x40000000; define symbol RAM_END_ADDRESS = 0x4000FFFF; 2. define memory name with size = expr [, unit‐size]; 作用: 定义一个可编址的存储地址空间(memory)。 参数: name ‐‐memory 的名称 expr ‐‐地址空间的大小 unit‐size ‐‐expr 的单位, 可以是位(unitbitsize), 缺省是字节(unitbytesize) 举例: define memory MEM with size = 4G; 3. define region name = region‐expr; 作用: 定义一个存储地址区域(region)。 一个区域可由一个或多个范围组成, 每个范围内地址必须连续, 但几个范围之间不必是连续的。 参数: name region 的名称 region‐expr memory:[from expr { to expr | size expr}], 可以定义起止范围, 也可以定义起始地址和 region 的大小 举例: define region ROM = MEM:[from 0x0 size 0x10000]; define region ROM = MEM:[from 0x0 to 0xFFFF]; 4. define block name[ with param, param... ] { extended‐selectors }; 作用: 定义一个地址块 (block); 它可以是个空块, 比如栈、 堆; 也可以包含一系列 sections。 参数: name block 的名称 param 可以是: size = expr (块的大小) maximum size = expr (块大小的上限) alignment = expr (最小对齐字节数) fixed order (按照固定顺序放置 sections) extended‐selector [ first | last ] { section‐selector | block name | overlay name } first 最先存放 last 最后存放 section‐selector [ section‐attribute ][ section sectionname ][object filename ] section‐attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ] sectionname section 的名称 filename 目标文件的名称 即可以按照 section 的属性, 名称及其所在目标文件的名称这三个过滤条件中, 任意选取一个条件, 或选取多个条件进行组合, 来圈定所要求的 sections。 name block 或 overlay 的名称 举例: define block HEAP with size = 0x1000, alignment = 4 { }; define block MYBLOCK1 = { section mysection1, section mysection2, readwrite }; define block MYBLOCK2 = { readonly object myfile2.o }; 5. initialize { by copy | manually } [ with param, param... ] { section‐selectors }; 作用: 初始化 sections。 参数: by copy 在程序启动时自动执行初始化。 manually 在程序启动时不自动执行初始化。 param 可以是: packing = { none | compress1 | compress2 | auto } copy routine = functionname packing 表示是否压缩数据, 缺省是 auto。 functionname 表示是否使用自己的拷贝函数来取代缺省函数。 section‐selector 同上 举例: init...