对于 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( ) 还对 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 文件中,把
#i nclude
改成
#i nclude
#i nclude
如此,即可以直接将编译后的代码用于该两类 MCU 上,不过,还需要注意的是,由于该两
类 MCU 没有软件堆栈和 RAM,所以,程序中*禁止*使用全局变量、局部静态变量以及中断
处理以外的函数(其实在 GCC 中,中断处理程序叫做“信号”,不叫函数),并且,在中
断处理过程中,最好不要开放中断,否则会引起数据错误(并非不可以,但需要一些技
巧)。
由此可见,使用 AVRGCC,可以完全的代替其它的 AVR 程序开发工具——甚至可以直接扔掉
汇编语言。
阅读(1612) | 评论(0) | 转发(0) |