iar icf

Initializeby copy 

EN:Splits the section into sections for initializers and initializeddata,and handles theinitialization at application startup automatically.

将段分割开来初始化,程序启动时进行初始化。

向量表放在 .intvec 段中,一般将向量表放在 0 地址,即内部ram中,程序放在外部ram中。编译的时候生成的bin文件超过500MB,且在icf 文件中已经包含了initialize by copy { section .intvec  }; 如果 icf 文件中去掉 .intvec 段生成的文件就不会那么大。可见,分散加载的原因。

在手册上又找到了一句:

Anything reachablefrom the program  entry label is considered needed for initialization 

unless reached via asection fragment with a label starting with__iar_init$$done

如果没有  __iar_init$$done 这一句,编译器认为都需要初始化,于是bin文件变得很大。


下面转一些资料,网友翻译的EWARM_DevelopmentGuide.pdf文档

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-type][ section sectionname ][object filename ]

section-attribute--  [ ro  [ code | data ] | rw  [ code | data ] | zi ]

section-type – preinit_array|init_array 
sectionname -- section的名称 
object 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 同上 
举例: 
initialize by copy { rw }; 
6.    do not initialize 

section-selectors 
}; 
作用:    规定在程序启动时不需要初始化的sections。一般用于__no_init声明的变量段(.noinit)。 
参数:    section-selector 同上 
举例: 
do not initialize { .noinit }; 
7.    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 }; 
8.    place in region-expr 

extended-selectors 
}; 
作用:    把一系列sections和blocks放置在某个region中。sections和blocks将按任意顺序放置。 
参数:    region-expr region的名称 
extended-selector 同上 
举例: 
place in ROM { readonly };         /* all readonly sections */ 
place in RAM { readwrite };         /* all readwrite sections */ 
place in RAM { block HEAP, block CSTACK, block IRQ_STACK }; 
place in ROM { section .text object myfile.o };     /* the .text section of myfile.o */ 
place in ROM { readonly object myfile.o };         /* all read-only sections of myfile.o */ 
place in ROM { readonly data object myfile.o };     /* all read-only data sections 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    with alignment = 8, size = __ICFEDIT_size_cstack__   { };

C中:

#pragma language="extended" 
#pragma segment="CSTACK"

ptr = __sfe( "CSTACK" );可得到CSTACK的高端地址+1

__sfe: Returns last address of segment.

[code=cpp]
sd
[/code]

FROM:http://blog.chinaunix.net/uid-21977330-id-3253684.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值