IAR for stm8 中指定编译的起始地址

IAR for stm8 中指定编译的起起地址

已经用STVD+cosmic完成了IAP功能,但想试着在STM8上跑上官的UCOS,不得不用IAR编译,但编译后代码的生成地址怎么再从0X9000开始生成呢,找遍全网,也没有发现三言两语直接的表白,又对IAR环境不熟,看过了IAR下的工程设置的全部选项,都没有发现怎么修改这个地址,IAR的这个地址的修改,并不象KEIL及STVD下那么直接,它必须通过IAR的根目录下有个CONFIG的文件夹,里面有各种单片机的*.icf的文件,我看着有两处0x8000改为0x9000,然后编译文件,呵呵,果然有效,在STVP下,发现HEX文件就是从0x9000开始生成代码了。找的好辛苦,又不太懂英文看帮助,唉,只能受此罪!
ICF修改的是以下三项:

define region NearFuncCode = [from 0x9000 to 0xFFFF];

define region FarFuncCode = [from 0x9000 to 0xFFFF];

define region HugeFuncCode = [from 0x9000 to 0xFFFF];

以下是摘抄的有关ICF文件部分

 

 

IARxclicf文件详解

链接器和链接器的配置 

2.1 EWARM 4.xx的链接器XLINK及其配置文件.xcl

XLINK链接器可以把IAR汇编器或编译器所产生的可重定位的UBROF目标文件转换成针对目标处理器的机器码。XLINK一般通过外部链接器命令文件(*.xcl)来配置,当然也可以在命令行中直接在xlink命令之后输入链接选项,或者也可以在XLINK_ENVPAR环境变量中设置链接选项。下面介绍XCL文件中常用的链接选项,以便在版本迁移之前,确切地了解XCL文件的含义。

2.2 XLINK选项

下面介绍几个XCL文件中常见的链接器配置选项。更详细的内容请查阅XLINK的参考手册:IAR Linker and Library Tools Reference Guide

-D -Dsymbol=value

作用:

使用-D选项可以定义一些纯粹的符号,一般用于声明常数。

参数:

symbol是未在其它地方定义过的外部符号,valuesymbol所代表的值。例如:

就定义了2个标识了ROM起始和结束地址的符号,这样以后关于ROM地址的配置都可以直接使用这2个符号,使得配置文件的可读性增强。

-Z -Z [@] [(SPLIT-)type] segments [=|#] range [, range] …

作用:

使用-Z命令的目的是规定segments在存储空间中占据的位置和区间。如果链接器发现某个segment没有使用-Z-b或者-P中的任何一个命令进行定义,则会报错。

参数:

使用@参数,表示为segments分配空间时不考虑任何已经被使用的地址空间。这适用于当某些segments的地址空间需要发生重叠的情形。

type 参数type规定了segments的存储类型,默认为UNTYPED。表1列举了IARARM C/C++编译器所支持的segments类型。

-Q -Q segment = initializer_segment 

作用:

自动设置segment的拷贝初始化。链接器会产生一个新的initializer_segment(如CODE_ID),其内容与segment(如CODE_I)完全一致。相关的符号表和调试信息都会和segment相关联(如CODE_I)。initializer_segment的内容(通常在ROM中)必须在初始化阶段被复制到segment(通常在RAM中)。

-c -cprocessor

作用:

规定目标处理器的类型。如-carm

.3 EWARM 5.xx的链接器ILINK及其配置文件.icf

EWARM 5.xx中的链接器称为ILINKILINK可以从ELF/DWARF格式的目标文件中提取代码和数据,并生成可执行映像。在EWARM 4.xx中,基本的代码和数据链接单元是segment,而对于ELF/DWARF格式而言,基本链接单元是sectionILINK根据ILINK Configuration File*.icf)来分配这些sections。由于XLINKILINK是两个完全不同的链接器,所以XCLICF也是两种完全不同的配置文件。下面简要介绍ICF文件的格式和内容,以协助用户完成版本迁移。

2.4 ICF格式浅析

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

section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]

sectionname section的名称

filename 目标文件的名称

即可以按照section的属性,名称及其所在目标文件的名称这三个过滤条件中,任意选取一个条件,或选取多个条件进行组合,来圈定所要求的sections

name blockoverlay的名称

举例:

define block HEAP with size = 0x1000, alignment = 4 { };

define block MYBLOCK1 = { section mysection1, section mysection2, readwrite };

define block MYBLOCK2 = { readonly object myfile2.o };

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

do not initialize

{

section-selectors 

};

作用:

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

参数:

section-selector 同上

举例:

do not initialize { .noinit };

place at { address memory[: expr] | start of region_expr | end of region_expr }

{

extended-selectors 

};

作用:

把一系列sectionsblocks放置在某个具体的地址,或者一个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 in region-expr 

{

extended-selectors 

};

作用:

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

参数:

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

 

IARICF文件分析与应用

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

section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]

sectionname section的名称

filename 目标文件的名称

即可以按照section的属性,名称及其所在目标文件的名称这三个过滤条件中,任意选取一个条件,或选取多个条件进行组合,来圈定所要求的 sections

name blockoverlay的名称

 

举例:

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

};

 

作用:    把一系列sectionsblocks放置在某个具体的地址,或者一个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

};

 

作用:    把一系列sectionsblocks放置在某个region中。sectionsblocks将按任意顺序放置。

 

参数:    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 };     

FROM:http://blog.21ic.com/user1/5910/archives/2009/61982.html

 

IARICF文件中宏给程序使用

 

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

从事电子技术工作这么多年一直想写点东西,但以限于本人文笔与技术水平一直没写。今天有空写点请多多指教。

 

 

 

define symbol NVNC_Start = 0x08000000; // 中断起始地址

define symbol NVNC_size_cstack   = 0x400; //中断堆栈尺寸

define symbol PROEG_size_heap    = 0x400;//程序堆栈尺寸

 

define symbol USB_SRAM_start  = 0x40006000; //USB 专用SRAM起始与结束地址
define symbol USB_SRAM_end    = 0x400063FF;

 

define symbol SyS_SRAM_start   = 0x20000000;  //定议RAM起始与结束地址
define symbol SyS_SRAM_end     = 0x2000FFFF; // 64K

 

define symbol SyS_Flash_start   = 0x08000800 ; //定议FLASH起始与结束地址
define symbol SyS_Flash_end     = 0x0801FFFF;  //512K

 

//define symbol SyS_Flash_P1 = (SyS_Flash_start+(0x800*0));

 



define memory mem with size = 4G;

 

 

 

define region USB_RAM = mem:[from USB_SRAM_start to USB_SRAM_end];

define region RAM_region = mem:[from SyS_SRAM_start to SyS_SRAM_end];

define region ROM_region = mem:[from SyS_Flash_start to SyS_Flash_end];

define region SysT_RAM = mem:[from 0x0801F800 to 0x0801FFFF];

 

 

 

define block CSTACK with alignment = 8, size = NVNC_size_cstack { };
define block HEAP   with alignment = 8, size = PROEG_size_heap  { };

 


initialize by copy { readwrite };



do not initialize  { section .noinit };


 

 

place at address mem:NVNC_Start { readonly section .intvec };

 

 

place in RAM_region { readwrite,block CSTACK, block HEAP }; // 堆栈指针存放

place in ROM_region   { readonly }; // 没有定议的C文件存放在此

//定议相关文件存储空间

 

 

以上文件只参考IAR目录下的:《EWARM_DevelopmentGuide.ENU.pdf

以上有错或本人理解不对请指出

IARICF文件中宏给程序使用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值