最近, 经朋友推荐, 得知新版的 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 来解决这个问题)
|