[AVR单片机] ICC换WINAVR了,第一个程序就出现了问题,Delay()函数的问题。

[复制链接]
5658|11
 楼主| aishiqi 发表于 2012-3-14 09:20 | 显示全部楼层 |阅读模式
本帖最后由 aishiqi 于 2012-3-14 09:33 编辑

我用MEGA8做了个闪烁LED的程序,但是始终不成功,我很郁闷,然后反复和实例对比,发现是一个怎么也想不到的问题,就是Delay()函数,如果要是用我以前的
Delay(){
int ;
for(i=0;i<6000;i++);
}
怎么都不行,改成delay.h里面的函数就没有问题了。

主程序是这样的:
int main(void)
{
  DDRB=0XFF;
  PORTB=0XFF;
  while(1)
  {
Delay();
PORTB&=~1;
Delay();
PORTB|=1;
}
}
更奇怪的是我不用任何Delay函数也不行
  while(1)
  {
PORTB&=~1;
PORTB|=1;
}
不行的表现是波形乱七八糟。
hjl2832 发表于 2012-3-15 11:26 | 显示全部楼层
怎么我看你的
Delay(){
int ;
for(i=0;i<6000;i++);
}
这个函数有问题,i 没定义,怎么编绎通过的?
应该是
Delay(){
int i;
for(i=0;i<6000;i++);
}
ccxlslr 发表于 2012-3-17 01:01 | 显示全部楼层
这个函数除了延时什么都不做,被优化掉了,从另一个角度来说,是浪费时间

要用 volatile int i;
airwill 发表于 2012-3-17 10:27 | 显示全部楼层
楼上是正解, 很可能函数被优化掉了.
ICC换WINAVR 的很大区别, winAvR 的优化能力很强!
TuBie 发表于 2012-3-18 08:38 | 显示全部楼层
老大,用volatile是什么意思?这样就不会被优化掉了吗?在其他编译器里是否也是这样?谢谢!

这个函数除了延时什么都不做,被优化掉了,从另一个角度来说,是浪费时间

要用 volatile int i;
ccxlslr 发表于 2012-3-17 01:01
晨星之光 发表于 2012-3-20 17:40 | 显示全部楼层
要不就设优化级为最低,要不就同3楼说的,加volatile 修饰变量
mtraveler 发表于 2012-3-21 16:40 | 显示全部楼层
可以使用winavr自带的延时函数。
bbslhb 发表于 2013-1-4 16:38 | 显示全部楼层
被优化的变量,定义的时候前面加一个volatile。
再就是winavr中自带有延时函数_delay_ms();括号中填写数值,可以设置多少毫秒的延时值。用的时候要include一下头文件。
qin552011373 发表于 2013-1-5 00:32 | 显示全部楼层
建议使用系统函数  还是很不错的  
wkatt1002 发表于 2013-5-28 14:48 | 显示全部楼层
ICC和winavr 编译器不同吗??ICC不是用GCC么??没用过ICC的说。。
huangxz 发表于 2013-5-28 14:57 | 显示全部楼层
wkatt1002 发表于 2013-5-28 14:48
ICC和winavr 编译器不同吗??ICC不是用GCC么??没用过ICC的说。。

不一样,
icc是国内avr比较常用的编译器
fp123123 发表于 2013-5-28 17:15 | 显示全部楼层
winavr是开源gcc的avr版本,应该是最好的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部