购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 编译工具介绍

有关AVR的C语言开发工具比较多,常用的有CVAVR(CodeVision AVR)、GCC AVR(GNU C for AVR)、IAR(IAR Embedded Workench)、ICC AVR(Imagecraft C Compiler for AVR)等。

CVAVR是HP Info Tech专门为AVR设计的一款C语言编译器,其界面比较友好,容易上手,并且带一个叫Codewizard的代码生成器,可以生成外围器件的相应初始化代码。该软件是收费产品,Demo版有2KB代码限制,可以通过其公司网站http://www.hpinfotech.ro下载。

GCC AVR是一款免费的C语言编译器,而且源代码是公开的。该软件本来是运行于Linux系统下的,后来由于其特别好用的缘故,就有“好事者”将其移植到Windows下,为Windows用户提供了一款免费的AVR单片机C语言编译器。不过其界面还有Linux编译器的风格,使用起来不是太容易上手。可以通过网站http://www.avrfreaks.net下载最新的GCCAVR软件。

IAR是IAR Systems公司开发的一款C语言编译器,该编译器不仅支持AVR单片机,而且支持众多的8位、16位、32位单片机。IAR Systems公司1983年成立,是全球领先的嵌入式系统开发工具提供商。据说在设计AVR单片机时,Atmel公司的设计人员是根据IAR编译器来优化AVR内部结构的,可见其在单片机编译器领域的地位,同时也可以说明其对AVR单片机的紧密结合性。该编译器的特点是编译环境功能比较强大,界面比较友好,代码执行速度快,价格昂贵,未注册软件有30天的试用期(另外一种Demo版有4KB代码限制),可以通过其网站http://www.iar.com下载。

ICC是ImageCraft公司开发的使用标准C语言的AVR单片机编译环境。其界面比较友好,并且带一个Application Wizard的代码生成器,也可以生成外围器件的初始化代码,因而很容易上手。不过该软件也是收费产品,未注册软件有45天(旧版本是30天)的试用期,可以从其网站http://www.imagecraft.com下载。

下面用一个表格的形式比较一下这4种AVR常用的C语言编译器,具体如表3-1所示。

表3-1 4种AVR常用C语言编译器比较

【建议】

● 初学者选择ICC或CVAVR,因为其界面比较友好,而且带有代码生成器,可以帮我们生成外围器件初始化代码。

● 入门后选择GCC,因为它是免费产品,虽然几乎没有技术支持,但因为其是自由软件,因而有大量的用户在使用,在网上可以找到很多的学习资料(Proteus有关AVR的例程就是基于GCC写的)。另外,GCC具有Linux软件风格,可以为我们进一步学习ARM-Linux开发做些准备工作。

● 商业用户,如果有条件可以选择IAR,它与AVR产品的紧密结合度可以保证其代码的优化程度、执行效率。

这里选择ICC作为AVR的C语言编译环境,因为其友好的开发界面和代码生成器,另外ICC国内的代理商是广州双龙公司,该公司也是AVR单片机的代理商,所以国内使用ICC的用户也相对较多,这样我们就可以更容易获取学习资料。

登录ICC的官方网站http://www.imagecraft.com会发现当前最新版是V8.0,不过国内用户使用更多的是V6.3.1版本,我们这里选择的是V7.22版。初学者最好选择相同版本的软件安装,这样可以减少在学习过程中遇到麻烦。

3.1.1 安装ICC AVR

软件的安装过程比较简单,我们抓几个主要界面作为安装提示。安装之前,如果操作系统运行有杀毒软件,最好先暂停其杀毒功能或退出运行。运行安装文件会看到安装程序的首界面,如图3-1所示。

接下来是安装目录的选择,默认是C:\iccv7avr\目录,如图3-2所示。最好按默认目录安装,因为根据网上介绍,ICC AVR对程序运行的路径支持并不是很好,所以最好不要使安装的目录太深,特别是不要包含中文目录。

单击“下一步”按钮,进入安装提示界面。在该界面单击“安装”按钮,直接进入文件安装的过程,安装完成后会给出提示界面,如图3-3所示。

到此就完成了ICC AVR编译环境的安装。下面运行ICC看看如何。

图3-1 ICC AVR安装首界面

图3-2 安装目录选择

图3-3 安装完成

3.1.2 运行ICC AVR

安装完成后桌面上会有“ICCV7 for AVR”的图标,双击该图标或选择菜单“开始”→“所有程序”→“ImageCraft Development Tools”→“ICCV7 for AVR”可以进入ICC AVR,“开始”菜单如图3-4所示。

图3-4 ICC AVR的“开始”菜单

启动ICC AVR的主界面,如图3-5所示。

如果手头有注册码,可以通过菜单“File”→“Register Software”完成软件的注册。如果不注册该软件也不会影响我们的学习使用,因为它有45天的试用期。

图3-5 ICC AVR主界面

完成了ICC AVR的安装过程,下面就可以使用它进行开发了。在学习开发之前我们先通过一个示例程序来简单了解一下ICC AVR的编译环境。

3.1.3 学用ICC AVR

1.打开工程

我们先打开一个实例工程,执行菜单命令“Project”→“Open…”打开选择工程界面,如图3-6所示。

找到ICC AVR的安装目录C:\iccv7avr\进入examples.avr目录,选择LED文件夹,进入该文件夹,有一个led.prj文件,选择该文件,如图3-7所示。

图3-6 选择工程界面

图3-7 选择LED例子工程

单击“打开”按钮,打开该工程,如图3-8所示。

2.打开led.c文件

在工程界面右侧的列表中有一个Project属性页,该属性页中有一个工程LED,下面有个文件夹,包含一个文件led.c,双击该文件,在左侧打开该文件,如图3-9所示。

先看一下代码文件led.c,最上面是引用的两个头文件io8515v.h和macros.h,引用这两个文件是什么用意呢?我们打开该文件看看。

图3-8 打开LED工程

图3-9 打开led.c文件

3.打开头文件io8515v.h

执行菜单命令“File”→“Open…”或单击工具栏上的“Open File…”按钮 来打开这两个文件。在弹出的选择文档对话框中找到ICC AVR的安装目录C:\iccv7avr\,进入include目录,如图3-10所示。

图3-10 include目录

在include目录中可以看到很多以.h结尾的头文件,在其中找到io8515v.h,然后单击“打开”按钮打开该文件,如图3-11所示。

图3-11 io8515v.h文件

打开io8515v.h文件后,先看看该文件的目录C:\iccv7avr\include\,仔细观察可以发现led.c中引用的macros.h文件也在该目录。这个目录就是ICC AVR头文件所在的位置,我们写代码时用#include < >语句引用的头文件,系统都会自动到这里查找。

接下来简单分析一下io8515v.h的内容,首先看到的是一个C语言的宏定义语句:

学习过C语言编程应该知道,这是为了防止该头文件被重复包含和编译。

接下来是一个注释行:

这是对文件的整体说明,告诉我们该文件是AT90s8515/4414寄存器和位定义的头文件,是针对ICC AVR编译环境的;后面一行是文件最后的修改时间信息。同时该注释也告诉我们,如果针对ATmega8/16编写程序,也要引用其对应的头文件。

再往下看就是该头文件的内容了,主要是用#define语句定义了一些宏定义,其实这也是我们在后面写程序中经常要用到的特殊功能寄存器的定义,有些类似学习51单片机时在Keil C51中看到的sfr、sbit的声明。

我们可以回头看看led.c文件(可以通过工具栏下的属性页来切换),找到main函数,该函数的前三行代码是:

注意观察,这里的DDRB、PORTB就是在头文件io8515v.h中定义的。

4.打开头文件macros.h

使用同样的方法可以打开macros.h文件,发现里面只有两行代码:

也就是说,该文件直接引用了AVRdef.h,这样我们就需要再打开AVRdef.h看看,如图3-12所示。

图3-12 AVRdef.h文件

观察该文件会发现,这里主要是用宏定义声明的一些常用的函数、汇编语句等。例如:

该语句可以在led.c中找到对其的使用,在led.c的LED_On函数中有这样一句:

BIT(i)就是对BIT(x)的调用,其中PORTB是在io8515v.h中声明的寄存器。将BIT(i)直接翻译一下,该语句变为:

这样就容易理解了。

有关AVRdef.h中的其他内容,如#define WDR() asm('wdr'),我们在以后使用时再做说明。

比较以上两个头文件会发现,io8515v.h是针对AT90s8515/4414的,而macros.h也就是AVRdef.h,是AVR单片机通用的,因此我们后面会更多地接触macros.h文件。

5.分析led.c

看完两个引用的头文件,再回头看看led.c文件,我们对其简单地分析一下(如图3-13所示)。

图3-13 led.c文件

可以看到,该文件一共包含了三个函数:Delay、LED_On、main。我们先从主函数main开始分析,该函数是写嵌入式软件必有的函数,也是单片机程序运行的起始位置,因而在看程序时,通常都会从该函数着手。

首先是变量i的声明int i;然后是端口的初始化DDRB = 0xFF;PORTB = 0xFF;接下来是一个while(1)的循环语句。细心的读者会发现,这里使用的是一个死循环,也就是说程序运行到这里就再也跳不出来了,除非内部有break、goto等跳出语句。这也是嵌入式程序的一个特点,因为嵌入式程序大多是上电后自动运行,而且运行起来后就不再停止了,所以通常在main函数中都会在最后使用一个while(1)的语句。

while语句内部并没有什么内容,主要是对LED_On函数的调用,这样我们就进入LED_On函数内部看看该函数是做什么的。该函数包含了两个语句:

第一个语句在前面已经分析过,将BIT宏定义展开后就是:

也就是1左移i位后,取反。这样整个语句就是将寄存器PORTB的i位设置为0,其他位设置为1。

接下来是对Delay函数的调用,我们不去看该函数,从其名字分析就可以知道,该函数是一个延时函数。就像macros.h头文件内部是宏定义一样,这也告诉我们,以后写程序要有好的书写习惯,定义函数、文件名、变量时,尽可能定义有意义的名字,不要用字母a、b、c,x1、y2、z3等这样的字符简单组合来命名。

进入Delay函数内部看看会发现,其内部的确是由两个for语句组成的空操作,目的就是为了让单片机在这里做空操作,浪费其时间起到延时的作用。回到LED_On函数就容易理解了,也就是将PORTB寄存器的i位置为0后做一段时间的延时,这就是该函数的功能。

再回到主函数main的while语句进行分析,那就是通过不同的for循环方式对LED_On进行调用,也就是通过不同的循环方式对PORTB寄存器的位做置0操作。在最后我们会通过Proteus更直观地来看该函数操作的结果。

6.编译工程

分析完程序代码,下面就用ICC AVR编译该工程。可以通过执行菜单命令“Project”→“Rebuild All”或单击工具栏上的builed Project按钮 来编译该工程。Rebuild All菜单如图3-14所示。

图3-14 Rebuild All菜单

编译结果可以在左侧源文件代码显示窗口的下方看到,如图3-15所示。如果看不到该窗口,可以通过菜单命令“View”→“Status Window”来打开该窗口。

图3-15 LED工程的编译结果

该结果中有两个警告信息:以“!W”开头的两个语句。我们可以简单地看看这两个语句,大概意思是Delay、main两个函数是旧的定义方式。另外,也可以双击警告行,上面的显示代码就会自动跳转到出现警告的下一行。

在这里说明一下,该警告是说Delay、main两个函数定义时用了比较旧的定义方式,也就是在定义空函数时没有说明参数是void。以前的函数定义对空函数没有具体的要求,因而大家写程序时比较随意,有时会不写或忘记写void参数,当时的编译器对此也没有要求,所以就会出现现在的问题。

找到了问题,我们修改一下两个函数的定义:

然后再次编译该工程会发现,这次编译一个警告也没有了(如图3-16所示)。

图3-16 没有警告的编译结果

通过这个简单的修改使我们注意到,写程序要养成良好的编写习惯。否则产品就会像ICC AVR这样的商业软件提供的源代码一样,出现一些小小的警告信息,这些不起眼的警告信息多了,也许不知道什么时间就会影响产品的稳定性。

上面只是通过一个示例程序简单地介绍了一下ICC AVR的一些基本功能,通过后面章节的学习,我们会进一步了解ICC AVR的使用。例如,怎样新建一个工程、怎样编写一个C程序、如何配置工程等。下面为了能够仿真调试,还要讲解另外一个开发工具,那就是AVR Studio。 rQ67ZsAl93r2ON9IheBFvr65omtHILBevjT15jevJAsCJpegMiJhQ1Z2gwub5BP5

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开