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

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

 

            对于 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 程序开发工具——甚至可以直接扔掉
      汇编语言。

猜你喜欢

转载自blog.csdn.net/catshit322/article/details/6672497