IAR工具中扩展名为icf的文件 |
您所在的位置:网站首页 › ilink是什么软件 › IAR工具中扩展名为icf的文件 |
icf文件
链接器的作用:可以从ELF/DWARF格式的文件中提取代码和数据,并生成可执行的输出镜像。 对于ELF/DWARF格式而言,链接单元为section,其中section可以是代码也可以是数据。 section: code data并且有以下三种属性: readonly (ro) readwrite (rw) zeroinit (zi)本文的案例是基于STM32L011,其memory map如下图所示: 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: 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 初始化sectionsinitialize {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 规定程序启动时不需要初始化的sectionsdo 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 |