打印
[AVR单片机]

IAR的一次使用笔记,奇怪现象,仅作经验记录

[复制链接]
4025|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
winsu|  楼主 | 2007-1-8 23:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2007年1月8日
用IAR(IAR Assembler for AVR 4.10A/W32 (4.10.1.5))编译时,发现一奇怪现象。
本程序是用型号为3310的LCD显示温度的测试程序,温度传感器用DS18B20。
调试好延时等,测试正常,能正常显示温度值,如加热传感器,温度值会上升。
整理程序,把一句没用到的函数删除,重新编译,温度显示不正常,但能识别DS18B20。
比较删除前与后,IAR编译后代码长度是一样的。
没办法,检查两种编译结果,发现check sum,不相同。改IAR的优化选项为"none",竟然整个程序不正常。
只好不断修改程序,测试问题所在。
使用GCC时,记得GCC对处理while{ }与do{ }while();是不同的,不知道IAR会不会也是这样,于是把while{ }改成do{ }while();

,编译后发现结果正确!编译后代码还少了2bytes。
什么原因就不追究了,也懒得去看汇编代码,只作经验记录了。

相关帖子

沙发
MicroMMU| | 2007-1-9 01:31 | 只看该作者

还有IAR有时候精过头。

比如设置优化后,特别要注意有些操作要在4个周期内连贯执行的,如EEPROM操作,修改系统CLK等,被它一优化就不连续了。

使用特权

评论回复
板凳
xwj| | 2007-1-9 08:38 | 只看该作者

while{ }与do{ }while();当然是不同的

使用特权

评论回复
地板
dadodo| | 2007-1-9 14:53 | 只看该作者

有时候优化还不如不优化

不优化,我知道我的程序在干什么,哪怕错了,MCU还是服从命令听指挥的

优化,谁知道编译器给哪段代码开了后门先执行,或者正事干完了再忙点别的

使用特权

评论回复
5
jjt1975| | 2007-1-22 13:49 | 只看该作者

程序空间够用的话,强烈建议不用优化选项。

使用特权

评论回复
6
jin2558| | 2007-1-22 23:19 | 只看该作者

还是多看看优化选项的定义吧,塾用volatile

使用特权

评论回复
7
ayb_ice| | 2007-3-7 11:05 | 只看该作者

随便说说

IAR的优化确实有问题.
同样的程序,改变优化级别确实可能不能运行(实际经验).

使用特权

评论回复
8
AA_55| | 2007-3-7 11:33 | 只看该作者

使用c语言就要掌握它,而不要抱怨编译器

很多人都只是会用而已,对C语言的机制不能准确掌握,然后就抱怨编译器。

在这里经常看到的一个例子,就是不使用volatile来修饰可能随时变化的编量,当编译器优化时候,程序行为就不正常了,然后就说发现了编译器的错误;还有一种例子,就是对变量类型处理不适当,结果溢出,然后也去抱怨编译器。

使用特权

评论回复
9
51avr| | 2007-3-10 13:32 | 只看该作者

不会用IAR的去用ICCAVR是个较好的选择

C语言有C语言的规则,特定编译器有他扩展的新规则。作嵌入式开发不要以为一C就灵。另外汇编代码的调试也是常用手段之一。
我移植别人用ICCAVR编译的程序到IAR编译器,用了4天时间,最高级优化代码空间降低了40%,运行速度降低不少但是执行没有问题。

使用特权

评论回复
10
mxh0506| | 2007-3-12 12:18 | 只看该作者

新版的IAR没发现过问题

3.2版的确实见到过,把声明为volatile的变量操作给优化掉了

使用特权

评论回复
11
syacedc| | 2007-3-13 16:27 | 只看该作者

volatile

不会吧?  连volatile都给优化掉了? 呵呵,

使用特权

评论回复
12
cnf.wan| | 2007-3-13 19:31 | 只看该作者

dowhile 是要执行一次 ,再作条件判断

使用特权

评论回复
13
winsu|  楼主 | 2007-3-14 12:42 | 只看该作者

IAR是一个很好的编译器

我现正把GCC的程序移植到IAR.
原程序编译后的代码差不多塞满了ROM, ROM只余几十bytes.
根据以往的经验,一个GCC的7K的代码, 用IAR可降到6K左右,当然用最优化的.

"强烈建议不用优化选项" --  用C, 如果不用优化, 那意义不大.
"IAR的优化确实有问题" -- 编译器没问题, 当怀疑编译器时, 千万不要以为自己比制作编译器的人更厉害.

死循环建议用:
for(;;)
do
{
}while(1);
避免用:
while(1)
{
}
经验发现这在GCC或IAR中有效.

使用特权

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

本版积分规则

16

主题

64

帖子

0

粉丝