3.3 ICCAVR集成开发环境简介
自ATMEL公司的AT90系列单片机诞生以来有很多第三方厂商为AT90系列开发了用于程序开发的C语言工具,ICCAVR就是ATMEL公司推荐的第三方C编译器之一。ICCAVR是一种符合ANSI标准的C语言来开发MCU程序的工具,功能合适、使用方便、技术支持好,它主要有以下几个特点:
1)ICCAVR是一个综合了编辑器和工程管理器的集成工作环境(IDE);
2)源文件全部被组织到工程之中,文件的编辑和工程的构建也在这个环境中完成,错误显示在状态窗口中,并且当点击编译错误时,光标自动跳转到错误的那一行;
3)工程管理器还能生成可以直接使用的INTEL HEX格式文件,该格式的文件可被大多数编程器所支持,用于下载到芯片中;
4)ICCAVR是一个32位的程序,支持长文件名。
3.3.1 ICCAVR编译器的安装
打开配套光盘内的ICCAVR安装文件,双击“setup.exe”进入安装界面(见图3-10)。单击“下一步”按钮后出现安装协议说明,选择同意安装协议。再单击“下一步”按钮出现安装路径的提示(见图3-11),可使用默认方式将其安装在C盘。单击“下一步”按钮进行文件复制(见图3-12),直到安装完成(见图3-13)。可在桌面上生成一个快捷方式,以后只需双击快捷图标即可使用。
图3-10 进入安装界面
图3-11 安装路径提示(默认C盘)
图3-12 文件复制
注意:
1)按上述方法进行安装后,得到的是一个只可以使用30天的未注册版,对正式版用户还要进行第2步的注册才可得到一个无时间限制的正式版。
2)ICCAVR正式版分标准版和专业版,在标准版中有一些功能限制,如代码的压缩,工程和文件的配置检查,在标准版中不可以使用。
对安装完成的软件进行注册的步骤如下:
对首次安装并且使用期未超过30天的用户可以这样注册:
1)启动ICCAVR编译器的集成工作环境(IDE)。
2)将正式版中附带的一张名称为“Unlock Disk”的软盘插入机器的软盘驱动器中。
3)在IDE的Help菜单中寻找标题为“Importing a License from a Floppy Disk”的一项并且单击。
4)ICCAVR软件自动进行注册,当注册完成后会提示注册文件已从软盘移走,当确定并再次重新启动ICCAVR后会发现软件已经完成注册。
对不是首次安装或使用时间已超过30天的用户可这样注册:
1)这类用户在程序启动时已不能进入IDE,而是出现一个提示注册的对话框,应该选择“Yes”按钮。
2)这时会出现一个注册对话框,对话框上有一个标题为“Importing a License from a Floppy Dis”的按钮。
3)将正式版中附带的一张名称为“Unlock Disk”的软盘插入机器的软盘驱动器中,单击上一步中提到的按钮。
图3-13 安装完成
4)ICCAVR软件自动进行注册,当注册完成后会提示注册文件已从软盘移走,当确定并再次重新启动ICCAVR后会发现软件已经完成注册。
注意:“Unlock Disk”软盘在注册时应打开写保护,否则无法完成注册。完成注册后“Unlock Disk”软盘成为一张空盘,不可以在另一台机器上进行安装和注册。当需要在不同的电脑中使用ICCAVR或在同一台电脑中将ICCAVR重新安装在与原来不同的目录位置时,应该首先在Help菜单中选择“Transferring Your License to a Floppy Disk”一项将注册文件传送到一张软盘上,然后再按上述方法进行安装注册。
3.3.2 ICCAVR中的文件类型及其扩展名
文件类型是由它们的扩展名决定的,IDE和编译器可以使用以下几种类型的文件。
1.输入文件
.c——表示是C语言源文件;
.s——表示是汇编语言源文件;
.h——表示是C语言的头文件;
.prj——表示是工程文件,这个文件保存由IDE所创建和修改的一个工程的有关信息;
.a——表示是库文件,它可以由几个库封装在一起,libcavr.a是一个包含了标准C的库和AVR特殊程序调用的基本库。如果库被引用,链接器会将其链接到用户的模块或文件中,用户也可以创建或修改一个符合需要的库;
2.输出文件
.s——表示是每个C语言源文件,由编译器在编译时产生的汇编输出文件;
.o——表示汇编文件汇编产生的目标文件,多个目标文件可以链接成一个可执行文件;
.hex——表示是INTEL HEX格式文件,其中包含了程序的机器代码;
.eep——表示是INTEL HEX格式文件,包含了EEPROM的初始化数据;
.cof——表示是OFF格式输出文件,用于在ATMEL的AVR Studio环境下进行程序调试;
.lst——表示是列表文件,在这个文件中列举出了目标代码对应的最终地址;
.mp——表示是内存映像文件,它包含了程序中有关符号及其所占内存大小的信息;
.cmd NoICE 2.xx——表示是调试命令文件;
.noiNoICE 3.xx——表示是调试命令文件;
.dbgImageCraft——表示是调试命令文件;
3.3.3 ICCAVR的附注和扩充
#pragma(编译附注);这个编译器接受以下附注:
#pragma interrupt_handler<func1>:<vector number><func2>:<vector>...
这个附注必须在函数之前定义。它说明函数func1、func2是中断操作函数。所以编译器在中断操作函数中生成中断返回指令reti来代替普通返回指令ret,并且保存和恢复函数所使用的全部寄存器,同样编译器根据中断向量号vector number生成中断向量地址。
这个附注指定了函数不生成挥发寄存器来保存和恢复代码,它的典型应用是在RTOS实时操作系统中让RTOS核直接管理寄存器。
这个附注改变代码段名称,使其与命令行选项相适应。
这个附注改变数据段名称,使其与命令行选项相适应。这个附注在分配全局变量至EE- PROM中时必须被使用,读者可参考访问EEPROM的例子。
这个附注表示函数与全局数据不使用浮动定位(重定位),而是从<address>开始分配绝对地址。这在访问中断向量和其他硬件项目时特别有用。
这个附注结束绝对定位,使目标程序使用正常浮动定位。
C++ 注释
如果选择了编译扩充(Project->Options->Compiler),可以在源代码中使用C++的//类型的注释。
二进制常数
如果选择了编译扩充(Project->Options->Compiler),可以使用0b<1|0>*来指定二进制常数。例如,0b10101等于十进制数21。
在线汇编
可以使用asm("string")函数来指定在线汇编代码。读者可参考在线汇编。
3.3.4 ICCAVR的代码转换
IAR C编译器作为应用于AVR的第一个C编译器,它有十分丰富的源代码。当从IAR编译系统转换到ImageCraft编译系统时,绝大多数符合ANSI C标准的程序代码不需要转换,IAR C中IO寄存器的定义与ICCAVR也是相同的。下面有几个对照的例子。
对于中断操作描述,ICCAVR使用pragma附注描述中断操作函数,而IAR引入了语法扩充(interrupt关键字)。在ICCAVR中:#pragma interrupt_handler func:4//4是这个中断的向量号,func为中断处理函数名称,ICCAVR可以使多个中断向量共用一个中断处理函数;在IAR中:interrupt[vector_name]func()//vector_name是某一个中断向量的名称,IAR C的中断向量地址使用中断名称来代替,以增加程序的可读性。
对于扩充关键字,IAR引入flash关键字将项目分配进入程序存储空间FLASH存储器,ICCAVR使用const关键字来达到相同的目的。
对于过程调用转换,在两个编译系统之间函数参数传递使用的寄存器是不同的,仅影响手工写的汇编函数。
对于在线汇编、宏等,IAR不支持在线汇编符号,而ICCAVR支持在线汇编。