Airwill的笔记 https://bbs.21ic.com/?5782 [收藏] [复制] [RSS]

日志

GCCAVR 和 CodeVision AVR 编译实测对比

已有 2136 次阅读2010-4-19 06:33 |系统分类:单片机| 单片机




    最近, 经朋友推荐, 得知新版的 CodeVisionAVR 增加了 CodeWizardAVR(
自动生成初始化代码功能), 又鉴于其超小体积的编译器和集成环境(IDE), 
不禁对其产生了兴趣. 于是对不久前下载到的 CVAVR 试用了一下, 并对其编译
特性和我现在正用的 WinAVR 进行了对比. 

现公布我的对比结果.
 编译器资料:
Keil C51 V8.0   (优化 9级)
WinAVR-20060421 (优化 size )
CodeVisionAVR VERSION 1.25.2 beta1 Standard (Small 最大优化 size)

测试程序介绍: 这是我自己编写的 uart 通信协议
主要有下面几个部分

1. TIMER_ISR(主要完成启动发送和超时错误中止)
KEIL_C51           73   115 bytes
GCCAVR 24a - 30c:  c2   194 bytes
CVAVR  131 - 192:  c2   194 bytes   
/*GCCAVR lst 文件计 byte 地址, 而 CVAVR lst 文件里计word 地址*/
                
2. UART_ISR(通信中断服务)
KEIL_C51          19A   410 bytes 
GCCAVR 30c - 5fc: 2f0   752 bytes
CVAVR  192 - 287: 1EA   490 bytes  

3. PC2   (时钟校正, 监控rxd引脚,保存定时器的值)
GCCAVR  D4 - 170: 9C    156 bytes
CVAVR   5e - 93:  6A    106 bytes          
        
4. CC   (校正判断, 采用四次采样, 去最大最小值, 求平均值的方法)
GCCAVR 170 - 212:  A2   162 bytes
CVAVR   93 - 116: 106   262 bytes     
              
 UART (模块名, 对比总共使用的代码空间)
GCCAVR  A4 - 6CA: 626   1574 bytes
CVAVR   5E - 2CF: 4E2   1250 bytes    
        31E- 3E7: 192   402 bytes   (公共子程序)
CVAVR  编译后的代码总空间: 1652bytes  
(还有几个小函数的编译对比未列出)

    对比的细节和结论说明:        
    CVAVR 能够将未用的死代码优化掉(不编译). 这一点是 gccavr 所没有的.
    
    另外 CVAVR 很喜欢生成大量公共子程序, 让我计算空间挺费劲.
    
    为了节省代码空间, 我使用了 goto. 可是 CVAVR 却不支持 goto! 没有弄
明白为什么, 经过简单处理后, 看编译结果(跳转指令)还能反映对比特性.

    cvavr 在数组和计算方面, 相距甚远; 而中断处理函数的空间, 略有优势, 
这主要得益于采用了模拟栈来保存寄存器, 这样可以调用公共子程序完成寄存器
保存和恢复.但大量的公共子程序对处理效率(速度)是很大影响的. 
 
    最后, 顺便提起一下 gccavr 的一个弱点. 当中断服务调用外部子程序时, 
尽管被调函数仅使用了很少的寄存器, 也会认为该函数改变了所有可变寄存器. 
然而这个弱点在 CVAVR 也同样存在.(Keil C51 通过 ORC 来解决这个问题)
                                                                                                                                2007-1-4

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)