ICCAVR

发布时间:2024-05-14 21:48:05 作者:汉语成语

ICCAVR是一种符合ANSI标准的C语言来开发MCU程序的一个工具,它具有功能合适、使用方便、技术支持强大等优点。ICCAVR就是ATMEL公司为AT90系列单片机开发我编译工具。

介绍

1ImageCraft的ICCAVR介绍

ImageCraft的ICCAVR是一种使用符合ANSI标准的C语言来开发微控制器MCU程序的一个工具它有以下几个主要特点:

ICCAVR是一个综合了编辑器和工程管理器的集成工作环境IDE其可在WINDOWS9X/NT下工作。

源文件全部被组织到工程之中文件的编辑和工程的构筑也在这个环境中完成编译错误显示在状态窗口中并且当你用鼠标单击编译错误时光标会自动跳转到编辑窗口中引起错误的那一行这个工程管理器还能直接产生您希望得到的可以直接使用的INTELHEX格式文件INTELHEX格式文件可被大多数的编程器所支持用于下载程序到芯片中去。

ICCAVR是一个32位的程序支持长文件名。

出于篇幅考虑本说明书并不介绍通用的C语言语法知识仅介绍使用ICCAVR所必须具备的知识因此要求读者在阅读本说明书之前应对C语言有了一定程度的理解。

2ICCAVR中的文件类型及其扩展名

文件类型是由它们的扩展名决定的IDE和编译器可以使用以下几种类型的文件。

输入文件:

.c扩展名----表示是C语言源文件

.s扩展名----表示是汇编语言源文件

.h扩展名----表示是C语言的头文件

.prj扩展名----表示是工程文件这个文件保存由IDE所创建和修改的一个工程的有关信息。

.a扩展名----库文件它可以由几个库封装在一起libcavr.a是一个包含了标准C的库和AVR特殊程序调用的基本库如果库被引用链接器会将其链接到您的模块或文件中您也可以创建或修改一个符合你需要的库。

输出文件:

.s对应每个C语言源文件由编译器在编译时产生的汇编输出文件

.o由汇编文件汇编产生的目标文件多个目标文件可以链接成一个可执行文件

.hexINTELHEX格式文件其中包含了程序的机器代码

.eepINTELHEX格式文件包含了EEPROM的初始化数据

.cofCOFF格式输出文件用于在ATMEL的AvrStudio环境下进行程序调试

.lst列表文件在这个文件中列举出了目标代码对应的最终地址

.mp内存映象文件它包含了您程序中有关符号及其所占内存大小的信息

.cmdNoICE2.xx调试命令文件

.noiNoICE3.xx调试命令文件

.dbgImageCraft调试命令文件

3附注和扩充

#pragma编译附注

这个编译器接受以下附注

#pragmainterrupt_handler<func1>:<vectornumber><func2>:<vector>...

这个附注必须在函数之前定义它说明函数func1func2是中断操作函数所以编译器在中断操作函数中生成中断返回指令reti来代替普通返回指令ret并且保存和恢复函数所使用的全部寄存器同样编译器根据中断向量号vectornumber生成中断向量地址#pragmactask<func1><func2>...

这个附注指定了函数不生成挥发寄存器来保存和恢复代码它的典型应用是在RTOS实时操作系统中让RTOS核直接管理寄存器#pragmatext:<name>

改变代码段名称使其与命令行选项相适应

#pragmadata:<data>

改变数据段名称使其与命令行选项相适应这个附注在分配全局变量至EEPROM中时必须被使用读者可参考访问EEPROM的例子#pragmaabs_address:<address>

函数与全局数据不使用浮动定位重定位而是从<address>开始分配地址这在访问中断向量和其它硬件项目时特别有用#pragmaend_abs_address

结束定位使目标程序使用正常浮动定位

C++注释

如果你选择了编译扩充(Project->OptiONs->Compiler)你可以在你的源代码中使用C++的//类型的注释二进制常数

如果你选择了编译扩充(Project->Options->Compiler)你可以使用0b<1|0>*来指定二进制常数例如0b10101等于十进制数21。

在线汇编

你可以使用asm("string")函数来指定在线汇编代码读者可参考在线汇编。

4代码转换

IAR或其它ANSIC编译系统的代码转换。

IARC编译器作为应用于AVR的个C编译器它有十分丰富的源代码当你从IAR编译系统转换到ImageCraft编译系统时绝大多数符合ANSIC标准的程序代码不需要转换IARC中IO寄存器的定义与ICCAVR也是相同的。

中断操作描述ICCAVR使用pragma附注描述中断操作函数而IAR引入了语法扩充interrupt关键字下面是一个对照。

在ICCAVR中:

#pragmainterrupt_handlerfunc:4//4是这个中断的向量号func为中断处理函数名称ICCAVR可以使多个中断向量共用一个中断处理函数。

在IAR中:

interrupt[vector_name]func()//vector_name是某一个中断向量的名称IARC的中断向量地址使用中断名称来代替以增加程序的可读性。

扩充关键字

IAR引入flash关键字将项目分配进入程序存贮空间FLASH存贮器ICCAVR使用const关键字来达到相同的目的。

过程调用转换

在两个编译系统之间函数参数传递使用的寄存器是不同的这仅影响手工写的汇编函数。

在线汇编宏等IAR不支持在线汇编符号而ICCAVR支持在线汇编。

特点

1.工程管理器还能直接生成可以直接使用的INTELHEX格式文件,该格式的文件可被大多数编程器所支持,用于下载到芯片中;

2.ICCAVR是一个32位的程序支持长文件名。

3.源文件全部被组织到工程之中,文件的编辑和工程的构筑也在这个环境中完成,错误显示在状态窗口中,并且当你点击编译错误时,光标自动跳转到错误的那一行;

4.ICCAVR是一个综合了编辑器和工程管理器的集成工作环境(IDE);

向导

录并且选择并打开led工程工程管理器显示在这个工程中只有一个文件led.c然后从Project菜单中选择Options命令打开工程编译选项在"Target"标号下选择目标处理器然后从Project菜单中选择MakeProject命令IDE将调用编译器编译这个工程文件并且在状态窗口中显示所有的信息。

如果没有错误在与源文件同一个目录在这个例子中是/icc/examples.avr中输出一个文件led.hex这个文件是INTELHEX格式大多数能支持AVRMCU的编程器和模拟器都支持这种格式并且能下载这个程序进入你的目标系统这样就完成了一个

程序的构筑如果你希望用支持COFF调试信息的工具来测试你的程序比如AVRStudio那么你需要从Project菜单中选择Options命令在编译标签下选择COFF输出文件格式对一些常用的功能你也可使用工具条或鼠标右键弹出菜单例如你可以在工程窗口单击鼠标右键选择编译选项。

在工程窗口中双击文件名IDE将使用编辑器打开这个文件按这个方法打开led.c作为试验可设置一些错误例如从一行中删除分号现在从Project菜单中选择MakeProject命令IDE首先自动保存已经改变的文件并且开始编译这个文件这时在状态,

窗口中会显示错误信息单击状态窗口中错误信息行或单击其左边的错误符号光标,将移到编辑器中错误行的下面一行上基本上所有C编译器都是这样开始一个新的工程。

从Project菜单中选择New命令并且浏览至你希望输出工程文件的目录输出文件的名称取决于你的工程文件名称例如如果你创建一个名称为foo.prj的工程那么输出文件名称为foo.hex或foo.cof等。

自从创建你自己的工程后你可以开始写你的源代码(C或汇编格式)并且将这个文件加入到工程文件排列中单击工具栏中Build图标可以很容易地构筑这个工程IDE输出与ATMEL的AVRStudio完全兼容的COFF文件你可以使用ATMEL的AVR

Studio来调试你的代码。为更容易地使用这个开发工具你可以使用应用程序向导来生成一些使用有关硬件的初始化代码

2C程序的剖析

一个C程序必须定义一个main调用函数编译器会将你的程序与启动代码和库函,数链接成一个可执行文件因此你也可以在你的目标系统中执行它启动代码的用,途在启动文件中很详细地被描述了一个C程序需要设定目标环境启动代码初始化这个目标使其满足所有的要求,通常你的main例程完成一些初始化后然后是无限循环地运行作为例子让我们看/icc/examples目录中的文件led.c。

#include<io8515.h>

/*为使能够看清LED的变化图案延时程序需要有足够的延时时间*/voidDelay(){unsignedchara,b;for(a=1;a;a++)for(b=1;b;b++);}voidLED_On(inti){PORTB=~BIT(i);/*低电平输出使LED点亮*/Delay();}voidmain()4{inti;DDRB=0xFF;/*定义B口输出*/PORTB=0xFF;/*B口全部为高电平对应LED熄灭*/while(1){/*LED向前步进*/for(i=0;i<8;i++)LED_On(i);/*LED向后步进*/for(i=8;i>0;i--)LED_On(i);/*LED跳跃*/for(i=0;i<8;i+=2)LED_On(i);for(i=7;i>0;i-=2)LED_On(i);}}

这个main例程是很简单的在初始化一些IO寄存器后之后它运行在一个无限循环中并且在这个循环中改变LED的步进图案LED是在LED_On例程中被改变的在LED_On例程中直接写正确的数值到IO端口因为CPU运行很快为能够看见图案变化LED_On例程调用了延时例程因为延时的实际延时值不能被确定这一对嵌套循环只能给出延时的近似延时时间如果这个实际定时时间是重要的那么这个例程应该使用硬件定时器来完成延时,其它的例子8515intr.c程序很简单但同样清楚地显示了如何用C写一个中断处理过程这两个例子可以作为你的程序的起点。

IDE环境

1编译一个单独的文件

正常建立一个输出文件的次序是你首先应该建立一个工程文件并且定义属于这个工程的所有文件然而我们有时也需要将一个文件单独地编译为目标文件或最终的输出文件这时可以这样操作从IDE菜单File中选择CompileFile...命令来执行toObject和toOUTPUT中的任意一个当你调用这个命令时文件应该是打开的并且在编辑窗口中可以编辑的。

编译一个文件为目标文件toObject对检查语法错误和编译一个新的启动文件是很有用的编译一个文件为输出文件toOUTPUT对较小的并且是一个文件的程序较为有用注意这里使用默认的编译选项。

2创建一个新的工程

为创建一个新的工程从菜单Project中选择New命令IDE会弹出一个对话框在对话框中你可以指定工程的名称这也是你的输出文件的名称如果你使用一些已经建立的源文件你可在菜单Project中选择AddFile(s)命令。

另外你可以在菜单File中选择New命令来建立一个新的源文件来输入你的代码你可以在菜单File中选择Save或SaveAs命令来保存文件然后你可以象上面所述调用AddFile(s)命令将文件加入到工程中也可在当前编辑窗口中单击

鼠标右键选择AddtoProject将文件加入已打开的工程列表中通常你输出源文件在工程同一个目录中但也可不作这样要求。

工程的编译选项使用菜单中Project中的OptiONs命令。

3工程管理

工程管理允许你将多个文件组织进同一个工程而且定义它们的编译选项这个特性允许你将工程分解成许多小的模块当你处理工程构筑时只有一个文件被修改和重新编译如果一个头文件作了修改当你编译包含这个头文件的源文件时IDE会自动重新编译已经改变的头文件。

一个源文件可以写成C或汇编格式的任意一种C文件必须使用.c扩展名汇编文件必须使用.s扩展名你可以将任意文件放在工程列表中例如你可以将一个工程文档文件放在工程管理窗口中工程管理器在构筑工程时对源文件以外的文件不予理睬。

对目标器件不同的工程可以在编译选项中设置有关参数当你新建一个工程时使用默认的编译选项你可以将现有编译选项设置成默认选项也可将默认编译选项装入现有工程中默认编译选项保存在default.prj文件中。

为避免你的工程目录混乱你可以指定输出文件和中间文件到一个指定的目录通常这个目录是你的工程目录的一个子目录。

4编辑窗口

编辑窗口是你与IDE交流信息的主要区域在这个窗口中你可以修改相应的文件当编译存在错误时用鼠标单击有关错误信息时编辑器会自动将光标定位在错误行的位置注意对C源文件中缺少分号的错误编辑器定位于其下面一行。

5应用构筑向导

应用构筑向导是用于创建外围设备初始化代码的一个图形界面你可以单击工具条中的Wizard按钮或菜单Tools中的ApplicationBuilder命令来调用它。应用构筑向导使用编译选项中指定的目标MCU来产生相应的选项和代码。

应用构筑向导显示目标MCU的每一个外围设备子系统它的使用是很显而易见的在这里你可以设置MCU的所具有的中断内存定时器IO端口UARTSPI和模拟量比较器等外围设备并产生相应的代码如果你需要的话还可产生main()函数。

6状态窗口

状态窗口显示IDE的状态信息。

7终端仿真

IDE有一个内置的终端仿真器注意它不包含任意一个ISP在系统编程功能但它可以作为一个简单的终端或许可以显示你的目标装置的调试信息也可下载一个ASC码文件。

从6.20版本开始IDE加入了对ISP的支持。