avr-gcc中关于delay延时函数的应用
#i nclude
就可以使用了。这个头文件定义了两个级别的延时函数分别是:
; 在51中我们的延时函数都是自己编写的void _delay_us (double __us) ;
void _delay_ms (double __ms);
sp;
不过不可以高兴的太早,因为要在你的avr-gcc中正确使用它们是有条件的,下面我将慢慢道来。
这个参数和 Makefile 中的 F_CPU 值有关,Makefile 所定义的的F_CPU 变量的值会传递给编译器。你如果用AVR_studio 4.1X来编辑和调试,用内嵌AVR-GCC的进行编译,并且让AVR_studio 帮你自动生成Makefile 的话,那你可以在:
,无论是在汇编中还是在C言语中。虽然有模写下你的F_CPU的值,F_CPU这个值表示你的AVR单片机的工作频率。单位是 Hz ,不是 MHZ,不要写错。如 7.3728M
你会发现在"delay.h" 头文件中有这个样的一个定义如下:
#ifndef F_CPU; 在51中我们的延时函数都是自己编写的
# warning "F_CPU not defined for
# define F_CPU 1000000UL
#endif
这是为了在你没有定义F_CPU这个变量(包括空),或是AVR_studio Frequency没有给值的时候,提供一个默认的 1MHz频率值。让编译器编译时不至于出错。
sp;
下面是这两个函数的实体:
void _delay_us(double __us)
{; 在51中我们的延时函数都是自己编写的
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us;
if (__tmp < 1.0)
else if (__tmp > 255)
else
_delay_loop_1(__ticks);,无论是在汇编中还是在C言语中。虽然有模
}
void _delay_ms(double __ms)
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms; // 4e3 是因为调用的_delay_loop_2()是四条指令的
if (__tmp < 1.0)
else if (__tmp > 65535)
else; 在51中我们的延时函数都是自己编写的
_delay_loop_2(__ticks);
}
你会发现他们都分别调用了
而这两个函数又如下所示:
void _delay_loop_1(uint8_t __count)板,有时还是有点烦。呵呵。不过在应用av
{
__asm__ volatile (
);
}
void _delay_loop_2(uint16_t __count),无论是在汇编中还是在C言语中。虽然有模
{
__asm__ volatile (
);
}
板,有时还是有点烦。呵呵。不过在应用av
这两个函数都是avr-gcc 的 inline汇编格式写的,具体的语法规则我就不多说了。可以参考avr-libc。不过这两个函数很简单,很容易明白。一个是字节递减,一个是字递减。如果你认真看上面几个函数,你就会发现要正确使用它们是有如下条件的:
sp;
对于第4条范围,来个例子:
sp;
只有具备了上面的条件你才可以正确使用延时函数 _delay_us () 和 _delay_ms () 。对于第三个条件,为什么要选用常量,还有第二个条件为什么要打开优化选项。这是为了让编译器在编译的时候就把延时的值计算好,而不是把它编译到程序中,在运行时才进行计算,那样的话,一是会增加代码的长度,还会使你的延时程序的延时时间加长,或是变得不可预料
avrgccdelay延时函 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)