AVR-GCC 的简单说明和个人的一些使用经验

                                               

                                            作者:DEF    文章来源:21ICBBS

 

对于 AVR-GCC 到底是什么,下文中有一些说明……这里也提出我的一些使用经验,以作抛砖引玉之用……

首先,AVR-GCC 的目标代码效率极高;

以 CodeVisionAVR 为对比(我没有 IAR 和 ICCAVR 的正版),同样功能的程序,经由 GCC 编译后的目标代码,通常比 CVAVR 的代码

短 20%~50%,且运行速度更快,甚至在许多小型的应用中,GCC 的代码效率都不输于汇编;不过,GCC 不支持 4 字节单精度浮点数

(只支持 8 字节双精度浮点数),所以在精度要求不高的浮点运算程序中,浮点函数部分代码长度要增加 10% 左右,运行时间要增加

10%~30%——这可以说是一大遗憾……

其次,GCC 的代码可读性和可移植性最高;

这个原理想来就不必说了……作为全球最大的自由软件开发组织的首选开发工具,GCC 是 C 语言事实上的工业标准,所以用 GCC 编制

的程序,几乎完全不必考虑移植性问题——当然,如果有嵌入式汇编,则另当别论——不过由于 GCC 的代码效率极高,所以基本上没有

需要使用汇编的地方了……



再者,GCC 是完全的自由软件;

GCC 是公开源代码的自由软件,因此使用它完全不必考虑价格因素,并且,由于有大量的高手参与它的开发,所以无论是 GCC 本身,还

是与 GCC 配套的 AVR 编译包,其更新速度和效率都是其它开发工具所远不能比拟的,这就极大的减少了出现因为开发工具本身的故障

引起的程序错误的概率,降低了维护成本……不过,美中不足的是,GCC 没有中文版(——但似乎目前能找到的 AVR C 编译器也没有

一个是中文版的??^^)

至于说到界面问题……其实大可不必担心……AVRGCC 完全符合 Atmel 的 AVR Studio 所要求的格式,所以可以直接用 AVR Studio 

挂接 AVRGCC 对程序进行编制和调试,另外,avrfreaks( http://www.avrfreaks.net/ ) 还对 AVRGCC 的各个组件进行了整合,

制作了便于安装和使用的 32位Windows 版 AVRGCC,并且提供了完整的使用手册(包括如何将 AVRGCC 挂接到 AVR Studio 上,当然,

仍然是英文的……)对 AVRGCC 的宣传到此为止(耿老先生别生气……不是存心搅你生意的……^^),以下是我的一些使用经验……



1、AVRGCC 不能像 CVAVR 或 ICCAVR 那样把特殊 I/O 口当变量来用,怎么办?

其实,使用 AVRGCC 的 inp(port) 和 outp(data,port) 宏就是最好的方法,但如果真的需要延续以往的使用方式,也可以照以下

方式办理:

#define dPORTA (*(unsigned char *)(PORTA + 0x20))

如此,就定义了一个 dPORTA 的伪变量,可以直接用于表达式中,并且用此种方式也可以实现类似 C51 中的 sfr 变量类型……



2、AVRGCC 不能编译带浮点函数的程序,怎么办?

很简单,在工程所在目录的 makefile 文件中,把 LDFLAGS = 项目最后加上 .-lm 就可以了……



3、怎么改变目标程序的优化方式?

在 makefile 文件的 CPFLAGS = 行中,加入 -Ox(x=1,2,3,s)就可以了,如果已经有了 -O 的项目,就改变现有的,1~3 代表

优化方式,s 代表按代码长度优化……



4、AVRGCC 能不能为 AT90S1200、ATTiny 系列进行 C 语言编程?

答案是肯定的!只不过,需要一些技巧……

首先,需要在 makefile 的项目中,把 MCU = 后面的内容改成 avr2,


其次,需要在程序所在的 c 文件中,把


#include <io.h>改成#include <iotn15.h>,#include <iomacros.h>如此,即可以直接将编译后的代码用于该两类 MCU 上,不过,

还需要注意的是,由于该两类 MCU 没有软件堆栈和 RAM,所以,程序中*禁止*使用全局变量、局部静态变量以及中断处理以外的函数

(其实在 GCC 中,中断处理程序叫做“信号”,不叫函数),并且,在中断处理过程中,最好不要开放中断,否则会引起数据错误

(并非不可以,但需要一些技巧)。

由此可见,使用 AVRGCC,可以完全的代替其它的 AVR 程序开发工具——甚至可以直接扔掉汇编语言。