djnxqc 发表于 2013-5-20 21:44:54

avr延时函数的问题

刚学avr,学习IO口的使用,想让LED闪烁,参考现有例程就写了个如下的延时函数,一下的函数是拿的现成的
void delay_ms(int time)
{
int i;
for(;time>0;time--)
for(i=0;i<1000;i++);
}
设置LED延时时间为1s,却发现LED不闪烁,后来搜索avr的延时函数看到了如下的写法,拈来试了下,LED闪了,我用的IAR是6202版本,刚从官网下的,我想问第一个延时函数是不是被编译器优化了,为什么没有起作用呢?又该如何设置呢?貌似在avr studio中单步调试类似DDRA=0xff;PORTA=0xff;delay_(1000)//2;PORTA=0x00;delay_(1000);的语句,调试注释有2的语句时就执行不下去了,不知道是怎么回事?望有经历的解答一下,谢谢啦{:tongue:}

后来可以使用的粘来的延时函数如下:
//delay.h
#ifndef __IAR_DELAY_H
#define __IAR_DELAY_H

#include <intrinsics.h>

#define XTAL 8 //可定义为你所用的晶振频率(单位Mhz)

#define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) )
#define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1000) )
#define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*1000000) )

#endif

zengzhx 发表于 2013-5-23 21:28:15

被编译器优化了,我用AVR有很多类似的经历。

djnxqc 发表于 2013-5-24 00:10:37

zengzhx 发表于 2013-5-23 21:28 static/image/common/back.gif
被编译器优化了,我用AVR有很多类似的经历。

嗯,的确是的
页: [1]
查看完整版本: avr延时函数的问题