|
发表于 2008-12-30 11:11:47
|
显示全部楼层
不敢苟同楼上
我相信,在中国用IAR的人多如牛毛,而且,所有版本的IAR,如IAR-AVR,IAR-430,IAR-C51,IAR-NEC,甚至IAR-ARM 4.x版,基本都是相通的, 出入并不是太大, 里面都有XCL文件,XCL说白了就是编译器控制指令的命令行,没什么特别的
IAR会把CODE代码分成若干个数据段,同时也会把RAM分成若干个段, 每段都有不同含义,文档上写的非常清楚, 编译器会很据命令行把代码或数据根据XCL文件所说明的罗列成你指定的代码
大家都熟悉AVR,洒家就以AVR的一个XCL文件为例解释一下:
/*****************************************************************************
*
* Atmel Corporation
*
* File : main.c
* Compiler : IAR EWAAVR 2.28a/3.10c
* Revision : $Revision: 1.3 $
* Date : $Date: Wednesday, August 10, 2005 13:47:10 UTC $
* Updated by : $Author: omella $
*
* Support mail : avr@atmel.com
*
* Supported devices : All devices with Bootloader Capabilities
* , and at least 1-KB SRAM can be used.
* The example is written for ?ATmega8
* ?ATmega16
* ?ATmega162
* ?ATmega169
* ?ATmega32
* ?ATmega64
* ?ATmega128
*
* AppNote : AVR231 - AES Bootloader
*
* Description : Loader receives encrypted data frames (generated using
* 'create' tool and sent by 'update' tool), decrypts them and
* executes the commands described in frames.
* For more information, refer to the Application Note
* Documentation.
*
*
****************************************************************************/
//A90系列控制器
//关闭警告:29
-ca90
-w29
//以ATMEGA128为例,解释下面编译控制指令
//ATMEGA128定义如下
//BOOT_SIZE=2000 8K的Bootload尺寸
//FLASH_SIZE=20000 128K的Flash
//IVT_SIZE=8C ATMEGA128的每个中断向量占4个字节,共35个中断,0x00~0x8B
//RAM_SIZE=1000 内部有4KB的RAM
//RAM_BASE=100 内部RAM开始地址从0x100开始
//APP_SRAM_USAGE=41E
//编译器控制指令注释
//"-Z" 按顺序连续放置段
//"-P" 放置段不需要连续
//=============================================================================
// Interrupt vectors
//放置CODE区域的INTVEC段,范围在0x1E000 - 0x1E08B 之间
-Z(CODE)INTVEC=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-BOOT_SIZE+IVT_SIZE-1)
//-H1895,没有使用的空间用0x1895填充,0x1895 等效RETI 指令
//-h(CODE) 0x1E000 - 0x1E08B,数据填充范围为:0x1E000 - 0x1E08B
-H1895 -h(CODE)(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-BOOT_SIZE+IVT_SIZE-1)
//=============================================================================
// Code memory
//函数有2种存储属性:
//__nearfunc 范围 0-0x1FFFE (128 Kbytes) 指针尺寸:16 bits 处理器选项:-v0, -v1, -v2, -v3, -v4
//__farfunc 范围0-0x7FFFFE (8 Mbytes) 指针尺寸:24 bits 处理器选项:-v5, -v6
//注:ATMEGA128 属于v3类型处理器
//NEAR_F Holds static and global __flash variables.
//CODE Holds program code declared __nearfunc.
//FARCODE Holds __farfunc program code.
//FAR_F Holds static and global __farflash variables.
//HUGE_F Holds static and global __hugeflash variables.
//DIFUNCT Holds pointers to constructor blocks that should be executed by the system startup
// code before main is called.
//INITTAB Contains compiler-generated table entries that describe the segment initialization
// that will be performed at system start up.
//SWITCH Holds switch tables for all functions.
-Z(CODE)NEAR_F,HUGE_F,SWITCH,INITTAB,DIFUNCT,CODE=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-1)
//-Z(FARCODE)FAR_F=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-1)
//=============================================================================
// RAM
-Z(DATA)NEAR_I,NEAR_Z=RAM_BASE-(RAM_BASE+RAM_SIZE-1)
-Z(DATA)RSTACK+50=RAM_BASE-(RAM_BASE+RAM_SIZE-1)
-Z(DATA)CSTACK+(RAM_SIZE-50-APP_SRAM_USAGE)=RAM_BASE-(RAM_BASE+RAM_SIZE-1)
//-Z(DATA)TINY_I,TINY_Z,TINY_N=RAM_BASE-FF
//-Z(DATA)TINY_I,TINY_Z,TINY_N=RAM_BASE-100
同样NEC的iar也并没有什么特别
就像选项字
其实,像16楼那样,定义本身就是非常标准的定义方式, 任何MCU都可以这样定义,反而指定了用段"OPTBYTE"只适合了NEC的IAR了
const uint08 OPTION_BYTE @0x0080 = 0x90 + DEFOSTS_EXP2_17 + RESET_PIN_AS_IS + OSCSEL_INTERNAL + LSINTOSC_CANT_STOP;
const uint08 PROTECT_BYTE @0x0081 = 0x83 + 0x20;
16楼的定义只是遗漏了__root修饰这个常量, 因为一个常量定义了,在整个系统没有使用过,IAR很聪明,这个常量从来没有用过,而且占用空间,极有可能被IAR优化,但是__root关键字可以解决这个问题,就是指定一个函数,一个变量,一个常量等等,不管你的项目使用与否,都必须罗列出来,分配其空间,不可将其优化没有
IAR是好东西,如果我有钱,我肯定用正版的,我也建议公司用正版的 |
|