打印
[AVR单片机]

如何编写才能提高ICC的编译效率呀?

[复制链接]
2127|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ARMBEST|  楼主 | 2011-7-24 18:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的将buf[0]取反后在crc8_table[]数组里查表

1,直接取反查表 buf[0]=crc8_table[~buf[0]],得到的数据是错误的。
    编译结果
    0020C E286      LDI R24,0x26
    0020D E090      LDI R25,0
    0020E 91E0 008D LDS R30,buf    //调用buf  视为16BIT了
    00210 27FF      CLR R31              
    00211 95E0      COM R30            //取反
    00212 95F0      COM R31
    00213 0FE8      ADD R30,R24
    00214 1FF9      ADC R31,R25
    00215 9024      LPM R2,Z
    00216 9220 008D STS buf,R2
    ICC将buf[0]视为16位的了。如0X01取反将是0XFFFE,查出结果错误。

2, 必须加上unsigned char声明,
    buf[0]=crc8_table[(uchar)~buf[0]]
    编译结果
    0020C E286      LDI R24,0x26
    0020D E090      LDI R25,0
    0020E 91E0 008D LDS R30,buf   //还是视为16BIT
    00210 27FF      CLR R31
    00211 95E0      COM R30
    00212 95F0      COM R31
    00213 27FF      CLR R31            //声明为uchar,清除高8bit
    00214 0FE8      ADD R30,R24   
    00215 1FF9      ADC R31,R25
    00216 9024      LPM R2,Z
    00217 9220 008D STS buf,R2

3, 用一个临时变量
    datatemp=~buf[0];
    buf[0]=crc8_table[datatemp];
    编译结果
(0125)      datatemp=~buf[0];
    0020B 90A0 008D LDS R10,buf
    0020D 94A0      COM R10
(0126)         buf[0]=crc8_table[datatemp];
    0020E E286      LDI R24,0x26
    0020F E090      LDI R25,0
    00210 2DEA      MOV R30,R10
    00211 27FF      CLR R31
    00212 0FE8      ADD R30,R24
    00213 1FF9      ADC R31,R25
    00214 9024      LPM R2,Z
    移来移去的。

要怎么写才能直接认为是8bit取反,查表呀?
就是希望这样的编译结果
    0020C E286      LDI R24,0x26
    0020D E090      LDI R25,0
    0020E 91E0 008D LDS R30,buf   //取buf[0]
//    00210 27FF      CLR R31          不存在
    00211 95E0      COM R30           //取反
//    00212 95F0      COM R31         不存在
    00213 27FF      CLR R31            //清除高8bit
    00214 0FE8      ADD R30,R24   
    00215 1FF9      ADC R31,R25
    00216 9024      LPM R2,Z          //查表
    00217 9220 008D STS buf,R2

相关帖子

沙发
plc_avr| | 2011-7-28 06:23 | 只看该作者
buf[0]  crc8_table[]两个变量都改成同一类型的声明unsigned char

使用特权

评论回复
板凳
ARMBEST|  楼主 | 2011-10-10 17:58 | 只看该作者
crc8_table[]是查表呀,必须放在FLASH里面

使用特权

评论回复
地板
airwill| | 2011-10-12 09:35 | 只看该作者
经过本人对比测试, 在 iccavr, cvavr, gccavr 中.
iccavr 的编译效率是最差的. 而且比后面两者差了好多.
如果楼主想提高代码效率, 先扔掉 ICCAVR, 改用 GCCAVR 吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

49

帖子

0

粉丝