来自:http://blog.csdn.net/hitxiaya/article/details/6607075
sections在地址空间中的存放是由ILINK链接器来实现的,而ILINK链接器是按照用户在ICF文件中的规定来放置sections的,所以理 解ICF文件的内容尤其重要。
一个标准的ICF文件可包括下面这些内容:
1.
2.
3.
4.
5.
下 面介绍了几条ICF文件中常见的指令,详细内容请参考ILINK相关说明文档(EWARM_DevelopmentGuide.pdf):
1.
作用:
参数:
name
expr
举例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;
2.
作用:
参数:
expr
unit-size --expr的单位,可以是位(unitbitsize),缺省是字节(unitbytesize)
举例:
define memory MEM with size = 4G;
3.
作用:
参数:
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.
{
extended-selectors
};
作用:
参数:
param 可以是:
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.
{
section-selectors
};
作用:
参数:
manually 在程序启动时不自动执行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否压缩数据,缺省是auto。
functionname表示是否使用自己的拷贝函数来取代缺省函数。
section-selector 同上
举例:
initialize by copy { rw };
6.
{
section-selectors
};
作用:
参数:
举例:
do not initialize { .noinit };
7.
{
extended-selectors
};
作用:
参数:
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 };
8.
{
extended-selectors
};
作用:
参数:
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 };
FROM:http://blog.21ic.com/user1/5910/archives/2009/61982.html
IAR的ICF文件中宏给程序使用
如果想定在rom空间
icf中:
place at address mem:0x08090000 { readonly section .test };
C:中:
#pragma location = ".test"
const u32 uiData[512];// const 切不可省略
如果想定在ram空间
icf中:
place at address mem:0x08090000 { readwrite section .test };
C:中:
#pragma location = ".test"
u32 uiData[512];
可发现uiData的值为0x08090000
该法可方便通过ICF指定某变量的地址。
程序也可以。写法类似.vector
如果用block的方。类似
define block CSTACK
C中:
#pragma language="extended"
#pragma segment="CSTACK"
ptr = __sfe( "CSTACK" );可得到CSTACK的高端地址+1
__sfe: Returns last address of segment.