CVAVR 软件中启动delay库,调用delay_ms()函数,自动带了喂狗程序
- 格式:doc
- 大小:37.00 KB
- 文档页数:5
c延时函数delay延时函数(delay function)是一种在程序中用来暂停一段时间的函数。
在C语言中,延时函数通常用于需要控制时间间隔的应用程序中,例如时钟、定时器、动画等。
在C语言中,实现延时函数有多种方法,下面将介绍两种常用的方法。
1.使用循环计数法延时函数最常见的实现方式之一是使用循环计数法。
具体步骤如下:-接收一个参数,表示延时的毫秒数;-将参数转换为循环需要的次数。
在现代计算机中,循环一次通常需要几十纳秒到几百纳秒的时间,因此需要将毫秒数转换为相应的循环次数;-使用一个循环来延时,每次循环后递减计数器,直到计数器为0。
下面是一个使用循环计数法实现的延时函数的示例代码:```c#include <stdio.h>#include <stdlib.h>void delay(int milliseconds)for(int i = 0; i < iterations; i++)//什么都不做,只是进行循环迭代}printf("Before delay\n");delay(1000); // 延时1秒printf("After delay\n");return 0;```2.使用标准库函数- `sleep(`函数:使程序休眠指定的秒数。
参数是休眠的秒数。
下面是使用`usleep(`函数实现延时的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>void delay(int milliseconds)usleep(milliseconds * 1000); // 将毫秒转换为微秒int maiprintf("Before delay\n");delay(1000); // 延时1秒printf("After delay\n");```无论是使用循环计数法还是使用标准库函数,延时函数都有一定的局限性。
早就知道AVR的编译器有自带的延时子函数(或者说是头文件),但一直没时间一探究竟,今天终于揭开了其内幕。
AVR编译器众多,可谓是百家齐鸣,本人独尊WinAVR.说明:编译器版本WinAVR-20080610先说winAVR的_Delay.h_肯定是在Include文件夹下了,进去一看果然有,可打开一看,其曰:“This file has been moved to<util/delay.h>."在util文件夹中找到delay头文件如下:--------------------------------------------------------------------------------------------------------------------------------------------void_delay_us(double __us){uint8_t __ticks;double __tmp = ((F_CPU) / 3e6) * __us; //3e6=3000000if (__tmp< 1.0)__ticks = 1;else if (__tmp> 255){_delay_ms(__us / 1000.0);return;}else__ticks = (uint8_t)__tmp;_delay_loop_1(__ticks);}-----------------------------------------------------------------------------------------------------------------------------------------------_delay_ms(double __ms){uint16_t __ticks;double __tmp = ((F_CPU) / 4e3) * __ms;if (__tmp< 1.0)__ticks = 1;else if (__tmp> 65535){// __ticks = requested delay in 1/10 ms__ticks = (uint16_t) (__ms * 10.0);while(__ticks){// wait 1/10 ms_delay_loop_2(((F_CPU) / 4e3) / 10);__ticks --;}return;}else__ticks = (uint16_t)__tmp;_delay_loop_2(__ticks);}1、分析程序发现上面两个子函数,分别using _delay_loop_1() and using_delay_loop2()2、还有一点,用此头文件时,必须设置主频和优化项,否则会出现如下提示:#ifndef F_CPU/* prevent compiler error by supplying a default */# warning "F_CPU not defined for <util/delay.h>"# define F_CPU 1000000UL#endif#ifndef__OPTIMIZE__# warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"#endif3、通过查找发现_Delay_loop1()和_Delay_loop2()在文件delay_basic.h中,如下:/** \ingrouputil_delay_basicDelay loop using an 8-bit counter \c __count, so up to 256 iterations are possible. (The value 256 would have to be passedas 0.) The loop executes three CPU cycles per iteration, not including the overhead the compiler needs to setup the counter register.Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds can be achieved.*/上面翻译如下:循环变量为8位,所以可达256(其值256和0等同),每次循环好执行3个CPU时钟,不包括程序调用和退出该函数所花费的时间。
CodeVisionA VR V ersion 1.24.7 User Manual 读书笔记1、CodeVisionA VR 是一个交互的C 编译器,有完整的IDE和自动生成初始化程序的功能,并且支持A VR系列的微控制器。
2、CV A VR编译器几乎完全贯彻了ANSI C语言的标准,为了更好地支持A VR 微控制器和对嵌入式系统的需要,CV A VR进行了专门的优化处理。
3、CV A VR编译生成的“COFF”(一种通用的对象文件格式(Common Object File Format))目标文件支持C源代码级的调试,例如变量观察;同时“COFF”也能在A VR的官方调试仿真工具“Atmel A VR Studio debugger ”中进行仿真调试。
4、CV A VR的IDE内建了A VR在线编程功能,能自动传输二进制代码文件到A VR芯片上。
并且对大多数常用的的串并在线ISP编程提供了界面友好的支持。
(我也用它来烧写芯片)5、CV A VR还提供了一个在调试时很有用的串口终端,能接收来自微控制器传过来的实时调试信息(这是很有用的一个功能,一般调试单片机程序有接LED显示调试参数,软件仿真,硬件仿真,和通过串口实时传输调试信息到PC上)。
6、除了标准的C语言函数库外,CV A VR 还提供了一些专用的库,例如:* Alphanumeric LED modules* Philips I2C bus* National Semiconductor LM75 Temperature Sensor* Philips PCF8563, PCF8583, Maxim/Dallas Semiconductor DS 1302 and DS1307 Real Time Clocks* Maxim/Dallas Semiconductor 1 Wire protocol* Maxim/Dallas Semiconductor DS1820, DS18S20 and DS18B20 Temperature Sensors * Maxim/Dallas Semiconductor DS1621 Thermometer/Thermostat* Maxim/Dallas Semiconductor DS2430 and DS2433 EEPROMs* SPI* Delays* Gray code conversion7、CV A VR IDE 有强大的自动生成初始化A VR单片机内部集成的硬件功能的代码功能。
延时程序计算公式CV A VR中提供了2个延时函数:The functions are:void delay_us(unsigned int n)generates a delay of n mseconds. n must be a constant expression.void delay_ms(unsigned int n)generates a delay of n milliseconds.This function automatically resets the watchdog timer every 1ms by generating the wdr instruction.其中delay_us(unsigned int n)要求n是常数,因为us要准确,使用变量的话会大大影响精度。
1us执行的指令不多。
在C程序中调用delay_us()后,你可以看生成的ASM代码,它不是使用CALL,而是用的宏,嵌入了一段代码。
当你系统时钟为1M时,调用delay_us(1)还会编译出错,因为嵌入的一段代码,已经超过了1us!而delay_ms(unsigned int n)中的N就可以是变量,它生成的汇编是采用CALL调用函数,两者不同。
另外,在delay_ms()中还清WDT(就是你使用了WDT,也能使用该函数)。
作为通用的delay_ms(),代码当然多了点。
以上可以查看CV A VR编译后产生的LST文件。
1。
没有好的汇编基础,和对A VR的彻底透彻的掌握,一般人写不出比它还要优化的通用代码。
2。
我已经说过多少遍了。
在实际的系统中尽量不要使用软件延时,浪费资源不说,系统很难做到并行处理。
因此对于10us以下的延时,考虑直接嵌入汇编的_nop_指令。
10-100us可以适当考虑使用delay_us(),而大于100us的延时,应该采用定时器中断了。
/************************************************************** ****/A VR单片机的指令,从执行每条指令的时钟数分:单时钟指令、双时钟指令、三时钟指令、四时钟指令4种,A VR单片机在外接8MHZ 晶振时,单时钟指令:ADC为例,每us(微秒)可以执行8条,即每条指令用时0.125us。
AVR的精确延时程序(2009-12-28 06:41:30)标签:avr延时杂谈分类:技术1.毫秒级的延时延时1ms;void delay_1ms(void){unsigned int i;for(i=1;i<(unsigned int)(xtal*143-2_;i++);}在上式中,xtal为晶振频率,单位为MHz.当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M时,延时函数软件仿真结果为999.5μs.如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。
下面的函数可以获得1ms的整数倍的延时时间:void delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay_1ms();}如果需要准确的延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值.2.微秒延时晶振频率为8MHz时1μs延时函数:void delay_1us(void){asm("nop");}当然也可以使用宏定义来实现1μs延时:#define delay_1us();asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")如果小于1μs的延时,只有使用宏定义实现,当然,也可以直接插入在线汇编asm("nop");语句实现延时。
在程序中需要微秒级的延时时,可以用以下函数实现。
void delay_us(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay_1us();}说明:如果需要准确的延时时间,则还必须关中断,并通过软件仿真后,再确定循环的次数及循环初值.强调:在实际应用中一般不直接使用软件进行长时间的延时,因为MCU一直停留延时函数中(称为阻断),不能再干其它的事睛(除了中断外),只有非常简单的应用或者简单的演示时才能使用延时函数实现长时间延时。
c语言精确delay函数C语言中的精确延时函数是指能够以指定的时间精确延迟程序执行的函数。
在实际开发中,我们经常会遇到需要程序暂停一段时间的情况,这时就需要使用延时函数来实现。
在C语言中,常用的延时函数有两种,一种是使用循环来实现延时,另一种是使用系统提供的延时函数。
下面将详细介绍这两种方法的实现原理及其使用场景。
1. 循环延时法循环延时法是通过循环来实现延时的方法,其原理是让程序在一个循环中空转一段时间,从而达到延时的效果。
具体实现代码如下:```cvoid delay(unsigned int ms){unsigned int i, j;for(i = 0; i < ms; i++)for(j = 0; j < 10000; j++);}```上述代码中,delay函数接收一个参数ms,表示要延时的毫秒数。
函数内部使用两个嵌套的循环,外层循环控制延时的次数,内层循环则是一个空转的过程,通过调整内层循环的次数来控制延时的时间。
循环延时法的优点是简单易懂,适用于较简单的延时场景。
但是由于循环的执行时间受到处理器的影响,不同的处理器执行相同的循环时间可能会有差异,因此不能保证延时的精确性。
2. 系统延时函数系统延时函数是通过调用系统提供的函数来实现延时的方法,其原理是让程序暂停一段时间,从而达到延时的效果。
具体实现代码如下:```c#include <unistd.h>void delay(unsigned int ms){usleep(ms * 1000);}```上述代码中,delay函数接收一个参数ms,表示要延时的毫秒数。
函数内部使用usleep函数来实现延时,usleep函数的参数是微秒,所以需要将毫秒转换为微秒。
系统延时函数的优点是精确可靠,适用于对延时精度要求较高的场景。
由于系统延时函数是由操作系统提供的,可以保证延时的精确性,不受处理器的影响。
C语言中的精确延时函数有循环延时法和系统延时函数两种方法,根据实际需求选择合适的方法来实现延时。
c延时函数delay
c语言中的延时函数delay函数是一种简单的延时函数,它能够在程序中帮助我们指定一段时间内暂停一段时间,它可以帮助我们控制程序的运行速度。
delay函数在多种编程语言中均有实现,而在c 语言中,只需要在代码中增加delay函数就可以实现延时的效果。
delay函数的使用非常简单,只需要在程序中添加delay函数,并指定延时时间即可实现延时功能。
delay函数的语法如下所示:delay(time);其中time参数是指定延时时间,单位为毫秒(ms)。
以下是一个C程序,它演示了在程序中使用delay函数实现延时功能: #include <stdio.h>
#include <windows.h>
int main()
{
tprintf(Program starts.
tSleep(3000); //Delay for 3 seconds
tprintf(Program continues.
treturn 0;
}
在这段代码中,我们使用delay函数Sleep()来指定程序延时3秒钟来实现延时功能。
另外,delay函数也可以被用作测试程序的工具,可以用它来观察程序的运行情况,这可以帮助我们更好地了解程序的执行细节,并及时发现可能出现的问题。
总之,delay函数是一种非常有用的函数,用它可以在程序中控制程序的运行速度,也可以做到测试程序运行状态的功能,使得我们在运用c语言开发软件的过程中可以轻松的实现延时功能。