Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225651
  • 博文数量: 59
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 493
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-26 17:46
个人简介

做技术要:鹰击长空,鱼翔浅底。

文章分类

全部博文(59)

文章存档

2017年(1)

2016年(3)

2015年(27)

2014年(28)

分类: 嵌入式

2014-12-04 13:34:42

sections在地址空间中的存放是由ILINK链接器来实现的,而ILINK链接器是按照用户在ICF文件中的规定来放置sections的,所以理解ICF文件的内容尤其重要。

 

一个标准的ICF文件可包括下面这些内容:

1.       可编址的存储空间(memory)

2.       不同的存储器地址区域(region)

3.       不同的地址块(block)

4.       Section的初始化与否

5.       Section在存储空间中的放置

 

下面介绍了几条ICF文件中常见的指令,详细内容请参考ILINK相关说明文档(EWARM_DevelopmentGuide.pdf):

define [ exported ] symbol name = expr;

作用:

指定某个符号的值。

参数:

exported 导出该symbol,使其对可执行镜像可用

name 符号名

expr 符号值

举例:

define symbol RAM_START_ADDRESS = 0x40000000;

define symbol RAM_END_ADDRESS = 0x4000FFFF;

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

作用:

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

参数:

name memory的名称

expr 地址空间的大小

unit-size expr的单位,可以是位(unitbitsize),缺省是字节(unitbytesize)

举例:

define memory MEM with size = 4G;

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];

 

define block name[ with paramparam... ]

{

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 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 };


/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$PROJ_DIR$\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/**/
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0803FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__   = 0x1000;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
/*initialize { by copy | manually } [ with paramparam... ]

{

section-selectors

};

作用:

初始化sections。

参数:

by copy 在程序启动时自动执行初始化。

manually 在程序启动时不自动执行初始化。

param 可以是: packing = { none | compress1 | compress2 | auto }

copy routine = functionname

packing表示是否压缩数据,缺省是auto。

functionname表示是否使用自己的拷贝函数来取代缺省函数。

section-selector 同上

举例:

initialize by copy { rw };

*/

initialize by copy { readwrite };
/*

do not initialize

{

section-selectors

};

作用:

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

参数:

section-selector 同上

举例:

do not initialize { .noinit };



*/
do not initialize  { section .noinit };
/*

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 };


*/

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

place in region-expr

{

extended-selectors

};

作用:

把一系列sections和blocks放置在某个region中。sections和blocks将按任意顺序放置。

参数:

region-expr:  region的名称

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 };



*/

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };


place in RAM_region   { section .shell.cmd };
keep { section .shell.cmd };
place in RAM_region   { section .sys.task };
keep { section .sys.task };
place in RAM_region   { section .sys.lib };
keep { section .sys.lib };
place in RAM_region   { section .driver };
keep { section .driver };


/*nvm support*/
place in RAM_region   { section .nvm.ram };
keep { section .nvm.ram };


如果想定在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.




阅读(7376) | 评论(0) | 转发(0) |
0

上一篇:STM32103 NOR SRAM 地址

下一篇:STM32型号参考

给主人留下些什么吧!~~