ILINK ICF文件解析及自定义段的存放

浏览:2953来源:本站时间:2020-09-09
在链接过程中,IAR链接器会依据链接器配置文件即icf文件,将编译器或汇编器生成的可重定位目标文件链接生成针对特定目标处理器的机器代码。链接过程涉及的MCU可编址存储空间范围、代码和数据的存储位置及顺序等都在链接器配置文件中进行定义。


1. IAR ICF文件解析

在链接过程中,IAR会依据链接器配置文件(icf文件)来决定链接过程,icf文件中主要包含的内容如下:
(1)可编址的存储空间(memory)
(2)不同的存储地址区域(region)
(3)不同的地址块(block)
(4)section的初始化与否
(5)section在存储空间的位置
下面以一个具体的IAR icf文件为例子来介绍IAR ICF文件中的内容。


(1)部分使用define symbol命令定义具有指定值的符号,例如ROM和RAM区域的首尾地址,使用符号来代替某具体的地址值便于icf文件配置命令的撰写和具有更好的可读性。


(2)部分涉及两个命令:
#define memory命令:该命令定义mcu可寻址的最大地址范围,例如32位MCU的最大可寻址范围为4g,使用define memory命令定义该寻址范围。
#define region命令:定义一个存储地址区域(region),例如ROM区和RAM区。一个区域可由一个或多个地址区间组成。


(3)部分使用define block命令了定义一个地址块(block),例如堆和栈空间区域。


(4)部分为系统初始化过程的配置命令,决定某一个section在初始化过程中是否要进行初始化。section中包含某一段代码或者数据,是链接过程中最小的可链接单位。
下图中命令表示对所有具有readwrite属性的sections(如*.data,*.bss等)进行自动初始化,而对于*.noinit这个section则不做初始化处理,该section包含_no_ini修饰的全局或静态变量。


(5)部分对所有的sections和blocks在地址空间中所处的位置进行了配置。首先将只读的异常向量表.intvec放置在0x0地址处,然后将余下的只读sections 以任意顺序存放在ROM_region中,将可读写的sections和栈、堆这些blocks以任意顺序存放在RAM_region中。


2. 如何使用icf文件命令指定存储位置

在使用IAR Embedded Workbench时,用户如果需要将源码中的某个函数或者变量定位到自定义的section,一般是使用#pragma location =“section”预处理指令来实现。#pragma location =“section”的作用是让编译器在执行编译操作时,将指令后面的函数或者变量放置到用户指定的section。例如下面代码示例用户自定义了Mydata和Myfunc两个section,下面介绍如何使用链接器配置命令将变量或者函数存储到特定位置。


若要将常量testpoint存储在ROM区域,可通过place in命令实现:
place in ROM { readonly section .Mydata};
若要将常量testpoint存储在用户指定地址0x0100处,可通过place at命令实现:
place at address MEM:0x0100 { readonly section .Mydata };
若要将函数function存储在ROM区域,可通过如下命令实现:
place in ROM { readonly  section .Myfunc};
若要将函数function存储在RAM区域,要令函数在RAM运行首先得在初始化过程中拷贝至RAM区域,可通过下面两条命令实现:
initialize by copy { readwrite ,section .Myfunc };
place in RAM {section .Myfunc };
以上仅为常用命令举例,更多命令相关细节内容请查阅IAR Help菜单下的指导手册。
京ICP备:京ICP备05011254号-1 版权归北京麦克泰软件技术有限公司所有
北京麦克泰软件技术有限公司