IAR工具中扩展名为icf的文件

您所在的位置:网站首页 ilink是什么软件 IAR工具中扩展名为icf的文件

IAR工具中扩展名为icf的文件

2023-08-31 20:19| 来源: 网络整理| 查看: 265

                                         icf文件

链接器的作用:可以从ELF/DWARF格式的文件中提取代码和数据,并生成可执行的输出镜像。

对于ELF/DWARF格式而言,链接单元为section,其中section可以是代码也可以是数据。

section:

 code data

并且有以下三种属性:

readonly (ro) readwrite (rw) zeroinit (zi)

本文的案例是基于STM32L011,其memory map如下图所示:

1、icf文件

icf:ILINK Configuration File,ILINK根据icf文件分配和定位EFL/DWARF 中的sections。

icf的主要包括的内容:

可编址的存储空间(memory):可编址表示可以对内存地址值进行操作不同的存储地址区域(region)不同的地址块(block)section的初始化与否section在存储空间的放置(placement)

2、icf常用命令 2.1 指定某个符号的值

define [exported] symbol name = expr;

解释:

exported:导出符号,使其对可执行镜像可用name:符号名expr:符号值

举例:

define symbol __ICFEDIT_region_IROM1_start__ = 0x08000000; define symbol __ICFEDIT_region_IROM1_end__   = 0x08003FFF;

ROM内存大小为:0x3FFF,即16K Bytes。

define symbol __ICFEDIT_region_IRAM1_start__ = 0x20000000; define symbol __ICFEDIT_region_IRAM1_end__   = 0x200007FF;

RAM内存大小为:0x7FF,即2K Bytes。

/*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000;

异常向量表的起始地址为0x08000000。

/*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x380; define symbol __ICFEDIT_size_heap__   = 0x800;

栈大小:0x380

堆大小:0x800

Tips:由__ICFEDIT_为前缀的符号是由ICF Editor自动定义,上面定义可以在IAR---》Options---》Linker选项里。

Linker界面如下所示:

checcksum配置方法如下:放在flash空间的最后4个bytes,代码中可以直接应用变量__checksum。并且需要在配置文件icf中规定checksum值存放在固定位置:

place at end of IROM1_region { ro section .checksum };

如果编译报错说找不到__checksum,需要在Extra Options添加--keep __checksum。

代码中声明__checksum为外部变量即可:

extern uint32_t __checksum;

调试过程中打开终端I/O:

2.2 定义一个可编址的存储地址空间(memory)

define memory name  with size = expr [,unit-size];

解释:

name:memory的名称expr:地址空间大小unit-size:expr的单位,可以是位unitbitsize,缺省为字节unitbytesize

举例:

define memory mem with size = 4G;

因为为32bits的地址总线,所以可以寻址的范围为4G。

2.3 定义一个存储地址区域(region)

define region name = region-expr;

解释:

name region名称region-expr: memory:[from expr {to expr | size expr}]   (可以定义起止范围,也可以定义起始地址和region大小)

举例:

define region IROM_region   =   mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]                               | mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__];

2.4 定义一个地址块(block)

define block name [with param, param...] {extended-selectors};

作用:定义一个地址块;可以是定义一个只保留指定大小空间的地址块,比如堆或栈;也可以包含一系列的sections,由extended-selectors选择。

解释:

name:block 名称param:可以是1)size=expr(块大小);2)maximum size = expr(块大小上限);3)alignment = expr(最小对齐字数);4)fix order(按照固定顺序放sections)extended-selectors:[first | last]{section-selector | block name | overlay name} 

extended-selectors解释如下:

section-selector[section-attribute][section section-name][object filename]

section-attribute[readonly[code | data] | readwrite[code | data] | zeroinit]

section-name:section的名称

filename:目标文件的名称

案例1:

/*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x380; define symbol __ICFEDIT_size_heap__   = 0x800;

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { }; define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

案例2:

define block MY_HEAP with size = 0x1000, alignment = 4 { };  define block MY_BLOCK1 = { section my_section1, section my_section2, readwrite };  define block MY_BLOCK2 = { readwrite object my_file2.o };  define block MY_BLOCK3 = { readonly code object my_file3.o }; 

2.5 初始化sections

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表示是否用自己的拷贝函数来替代缺省的拷贝函数)

案例:

initialize by copy { readwrite };

2.6 规定程序启动时不需要初始化的sections

do not initialize {section-selectors};

作用:规定在程序启动时不需要初始化的sections;一般用__no_init声明的变量段(.noinit)

参数:

section-selectors同上

案例:

do not initialize  { section .noinit };

2.7 把section或block放置在指定的起始地址

place at {address memory [:expr] | start of region_expr | end of region_expr} {extended-selectors};

作用:把section或block放置在指定的起始地址,或者一个region的起始或结束处。

参数:

memory:memory的名称expr:地址值,该地址必须在memory范围内region_expr:region的名称extended-selectors:同上

案例:

/*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000;

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

2.8 把section或block放置在指定的region中

place in region_expr{extended-selectors};

作用:把section或block放置在指定的region中

参数:

region_expr:region名称extended-selectors:同上

案例:

place in IROM_region  { readonly }; place in EROM_region  { readonly section application_specific_ro }; place in IRAM_region  { readwrite, block CSTACK, block HEAP }; place in ERAM_region  { readwrite section application_specific_rw };

3、系统预定义section&block

系统预定义:表示非自定义,系统自带

section&block名称描述存储空间CSTACKuser和system模式用到的栈RAMIRQ_STACKIRQ模式用到的栈RAMHEAP堆RAM.intvec异常向量表ROM.cstart初始化代码ROM.text程序代码ROM.data初始化的静态和全局变量RAM.bss未初始化的静态和全局变量RAM.noinit由__no_init声明的静态和全局变量RAM.rodata常量ROM



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3