关于IAR下面的.icf文件的格式
看了一下IAR下面帮助linker分配地址的icf文件,感觉有点不懂怎么弄得跟文章是的,都分不出哪个是语法关键字了。摘抄了一个请大家帮着指点一下:
//*****************************************************************************
//
// hello.icf - Linker configuration file for hello.
//
// Copyright (c) 2006-2009 Luminary Micro, Inc.All rights reserved.
// Software License Agreement
//
// Luminary Micro, Inc. (LMI) is supplying this software for use solely and
// exclusively on LMI's microcontroller products.
//
// The software is owned by LMI and/or its suppliers, and is protected under
// applicable copyright laws.All rights are reserved.You may not combine
// this software with "viral" open-source software in order to form a larger
// program.Any use in violation of the foregoing restrictions may subject
// the user to criminal sanctions under applicable laws, as well as to civil
// liability for the breach of the terms and conditions of this license.
//
// THIS SOFTWARE IS PROVIDED "AS IS".NO WARRANTIES, WHETHER EXPRESS, IMPLIED
// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 4053 of the EK-LM3S8962 Firmware Package.
//
//*****************************************************************************
//
// Define a memory region that covers the entire 4 GB addressible space of the
// processor.
//
define memory mem with size = 4G;
//
// Define a region for the on-chip flash.
//
define region FLASH = mem:;
//
// Define a region for the on-chip SRAM.
//
define region SRAM = mem:;
//
// Define a block for the heap.The size should be set to something other
// than zero if things in the C library that require the heap are used.
//
define block HEAP with alignment = 8, size = 0x00000000 { };
//
// Indicate that the read/write values should be initialized by copying from
// flash.
//
initialize by copy { readwrite };
//
// Indicate that the noinit values should be left alone.This includes the
// stack, which if initialized will destroy the return address from the
// initialization code, causing the processor to branch to zero and fault.
//
do not initialize { section .noinit };
//
// Place the interrupt vectors at the start of flash.
//
place at start of FLASH { readonly section .intvec };
//
// Place the remainder of the read-only items into flash.
//
place in FLASH { readonly };
//
// Place the RAM vector table at the start of SRAM.
//
//place at start of SRAM { section VTABLE };
//
// Place all read/write items into SRAM.
//
place in SRAM { readwrite, block HEAP };
有几个问题:
1) 这里面哪些是语法关键字。 section .intvec对照着startup看了一下好像是存放MSP和中断向量的flash 空间,section VTABLE有对应着什么呢?,有关于.icf定义的文章介绍么? 这些特殊段(section)的定义(比如intvec,VTABLE 等等是不是需要看IAR的编译器手册)。
2)heap 是什么东西,没见过。
define block HEAP with alignment = 8, size = 0x00000000 { };又想表达什么意思呢?
感谢各位
aaa1982 我最近也在看这个,看的蛮累的
兄弟加油! lg_army :
你知道IAR好的论坛么,我上他的官网上居然没找到,如果没有官方论坛就打算换成Jlink+Keil了,毕竟keil自己的官方论坛问什么都有人回答。
aaa1982 IAR EWARM使用指南 (转贴)- xcl文件(我分了一下段)
之前用ADS1.2,支持的IC越来越少,转到IAR下,编译的时候有不少错误,找来一点资料就解决掉了,转过来
希望可以帮到有需要的人;
本指南介绍了IAR Embedded Workbench for ARM 4.xx版本和5.xx版本之间的主要区别,并列举了将在4.xx版本下创建的工程迁移到5.xx版本时所需进行的主要工作。用户一般只需按照说明进行改动,如遇到未在本指南中说明的特殊部份,可以查阅IAR Embedded Workbench for ARM 5.xx所带的Migration Guide(EWARM_MigrationGuide.pdf)(需要详细的文档,请发邮件至:sale@bmrtech.com)
1 迁移概述
1.1 EWARM版本4.xx与5.xx的区别
IAR EWARM在版本4.xx与5.xx之间的主要区别是建立目标代码所用的文件格式不同。在4.xx版本下,IAR使用的是私有的UBROF格式,而 5.xx版本下使用的是业界标准格式ELF/DWARF。遵循ARM公司提出的ABI(Application Binary Interface)标准,EWARM 5.xx提供了目标文件级别的兼容性,即其它ABI兼容工具生成的目标库可以与EWARM生成的目标文件一起链接并调试;同时EWARM生成的目标库也能在其它ABI兼容工具里参与链接和调试,使得应用程序的开发更具灵活性。当然,这也意味着EWARM 5.xx里使用了全新版本的链接器ILINK来取代原先所用的XLINK,从而导致链接器配置文件也使用了新的格式:ICF,而不再是原先的XCL。关于这两种配置文件的格式和内容,下面还会详细介绍。
1.2 迁移工作
因为EWARM 4.xx和5.xx之间存在的上述差异,使得在4.xx版本下面创建的Project不能直接在5.xx版本中使用。对于EWARM的新用户,或者有经验的用户开发新的项目来说,首选的建议是基于5.xx中的相关例程来建立新的Project。如果在某些情况下,不得不基于以前在4.xx下所创建的 Project进行工作,则一般来说可能会有以下几个方面需要修改:
1. C/C++语言源代码
2. 汇编语言源代码
3. 链接器配置文件
4. 运行时环境和目标文件
5. 工程配置文件
对于具体的应用程序来说,通常并不是上面提到的每个部份都需要考虑。下面主要针对链接器配置文件的修改来介绍迁移过程中需要注意的内容。
2 链接器和链接器的配置
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是未在其它地方定义过的外部符号,value是symbol所代表的值。例如:
就定义了2个标识了ROM起始和结束地址的符号,这样以后关于ROM地址的配置都可以直接使用这2个符号,使得配置文件的可读性增强。
-Z -Z [@] [(SPLIT-)type] segments [=|#] range [, range] …
作用:
使用-Z命令的目的是规定segments在存储空间中占据的位置和区间。如果链接器发现某个segment没有使用-Z,-b或者-P中的任何一个命令进行定义,则会报错。
参数:
@ 使用@参数,表示为segments分配空间时不考虑任何已经被使用的地址空间。这适用于当某些segments的地址空间需要发生重叠的情形。
type 参数type规定了segments的存储类型,默认为UNTYPED。表1列举了IAR的ARM 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。
2.3 EWARM 5.xx的链接器ILINK及其配置文件.icf
EWARM 5.xx中的链接器称为ILINK。ILINK可以从ELF/DWARF格式的目标文件中提取代码和数据,并生成可执行映像。在EWARM 4.xx中,基本的代码和数据链接单元是segment,而对于ELF/DWARF格式而言,基本链接单元是section。ILINK根据ILINK Configuration File(*.icf)来分配这些sections。由于XLINK与ILINK是两个完全不同的链接器,所以XCL和ICF也是两种完全不同的配置文件。下面简要介绍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:,可以定义起止范围,也可以定义起始地址和region的大小
举例:
define region ROM = MEM:;
define region ROM = MEM:;
---------------------------------------------------------------------------------------------
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 ]
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 };
---------------------------------------------------------------------------------------------
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
};
作用:
把一系列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 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 */
3 其它
如果在EWARM 5.xx中直接打开4.xx所创建的工程文件,会有对话框询问是否自动将其转换成5.xx的工程文件;若选择OK,4.xx的工程文件会被转换成5.xx 的工程文件,当然原来的4.xx工程文件也会自动生成一个备份。某些配置信息无法被自动带入5.xx的工程,如链接器配置文件的路径等,因此请仔细检查相关的编译、汇编或链接选项,确保它们具有正确的设置。各配置选项的含义可参阅EWARM_UserGuide.pdf的Part 7.
在EWARM 5.xx版本中,默认的程序入口符号(Program Entry)由原先的__program_start更改为__iar_program_start,因此对于旧的4.xx汇编代码而言,需要更改这个入口符号名;当然也可以在EWARM 5.xx的Linker配置选项中修改默认的Program Entry。
在EWARM 4.xx版本中,在Linker配置选项的Output和Extra Output选项卡中都可以选择生成除UBROF格式之外的其他格式输出文件。在EWARM 5.xx中,Linker只能生成ELF/DWARF格式的输出文件,若需要Motorola S-Record,Intel HEX或简单Binary等其它格式的文件,可在Output Converter配置选项中设置。
在从EWARM 4.xx向5.xx版本的迁移过程中,除了需要更改链接器配置文件之外,可能还需要根据应用程序的具体情况,对某些其它方面做小的修改,如C/C++源代码和汇编语言源代码等,必要时可以参考IAR Embedded Workbench for ARM 5.xx所带的Migration Guide(EWARM_MigrationGuide.pdf)。 markmark 用source insight 就可以分辨出来了,读程序很方便 感谢 【3楼】 kebaojun305 详细资料! 感谢 感谢 kebaojun305 详细资料! 谢谢! 如何自定义一个段到固定地址呢,试验了很久未果。 mark mark! 这个不错。。 haodongdong mark mark mark /*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
// NXP17xxAPP部分代码,起始地址为0x2000开始
define symbol __ICFEDIT_intvec_start__ = 0x00002000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00002000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x10007FFF;
// define symbol __ICFEDIT_intvec_end__ = 0x000002FC;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x400;
define symbol __ICFEDIT_region_DATA_end__ = __ICFEDIT_region_RAM_end__ - __ICFEDIT_size_heap__ -__ICFEDIT_size_cstack__;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:;
define region RAM_region = mem:;
define symbol _AHB0_RAM_start__= 0x2007C000;
define symbol _AHB0_RAM_end__ = 0x2007FFFF;
define region AHB0_RAM_region = mem:;
define symbol _AHB1_RAM_start__= 0x20080000;
define symbol _AHB1_RAM_end__ = 0x20081FFF;
// 0x20082000~0x20083FFF AHB1 RAM 顶部 8K 的空间分配给USB专用
define region AHB1_RAM_region = mem:;
initialize by copy { section .bss, section .data};
do not initialize{ section .noinit };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {};
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ {};
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
//place at address mem:__ICFEDIT_intvec_end__ {readonly section CRP_DATA};
place in ROM_region { readonly};
place at address mem:__ICFEDIT_region_RAM_start__{section .bss, section .data};
place in RAM_region {readwrite };
place at address mem:__ICFEDIT_region_DATA_end__{block HEAP,
block CSTACK};
place in AHB0_RAM_region { readwrite data section AHB0_RAM_MEMORY};
place in AHB1_RAM_region { readwrite data section AHB1_RAM_MEMORY};
使用的时候如下:
// 定义的变量位于flash空间
#ifndef FLASH
#define FLASH _Pragma("location=\"FLASH\"")
#endif
//#ifndef AHBA_Ram
//#define AHBA_Ram _Pragma("location=\"AHB_RAM1_MEMORY\"")
//#endif
//0x2007C000 ~ 0x2007ffff
#ifndef AHB0_RAM
#define AHB0_RAM _Pragma("location=\"AHB0_RAM_MEMORY\"")
#endif
//0x20080000 ~ 0x20083fff
#ifndef AHB1_RAM
#define AHB1_RAM _Pragma("location=\"AHB1_RAM_MEMORY\"")
#endif mark 学习下 mark 学习 回复【9楼】zhonghua_li 蓝色天空
如何自定义一个段到固定地址呢,试验了很久未果。
-----------------------------------------------------------------------
.icf 文件定义一个段
/*- 外部 SRAM 地址范围定义 , 512Kbytes ,使用块1 NE3 -*/
define symbol __ICFEDIT_region_ESRAM_start__ = 0x68000000;
define symbol __ICFEDIT_region_ESRAM_end__ = 0x6807FFFF;
place at address mem:__ICFEDIT_region_ESRAM_start__{readwrite section .esram };
程序中,定义变量如下:
INT8U esram_data @".esram" ;
目前虽然能把esram_data 定位到 0x6800 0000 ,但是超过了 512K 地址空间,不知道怎么让编译器报警或报错,前段时间折腾了一下,未果。 mark mark mark! 找了好久, 終於找到要的東西了, 感激不盡!! mark 正好在看icf文件呢,谢谢分享 MARK
标记收藏学习谢谢! 找到了需要的资料,感觉真好! Mark 给力啊! 标记下,留着看看 学习一下 mark ,最近刚研究完这个icf文件,再重新温习一遍 mark 学习了 过来看看
页:
[1]