云主机测评网云主机测评网云主机测评网

云主机测评网
www.yunzhuji.net

什么是延时函数?它如何工作?

延时函数是一种编程工具,用于在代码执行时创建时间间隔或暂停。

延时函数编程中常用的一种功能,用于在程序执行过程中暂停一段时间,它广泛应用于各种场景,如控制LED闪烁频率、实现定时任务等,下面将详细介绍几种常见的延时函数及其实现方式。

一、循环延时

循环延时是最简单也是最早接触的延时方法,其基本原理是通过让单片机做一些无关紧要的工作来打发时间,通常使用forwhile循环来实现,这种方法简单易行,但精度较低,且会消耗CPU资源,以下是一个简单的微秒级和毫秒级延时函数示例:

void delay_us(uint32_t delay_us) {
    volatile unsigned int num;
    for (num = 0; num < delay_us; num++) {
        volatile unsigned int t;
        for (t = 0; t < 11; t++);
    }
}
void delay_ms(uint16_t delay_ms) {
    volatile unsigned int num;
    for (num = 0; num < delay_ms; num++) {
        delay_us(1000);
    }
}

二、定时器中断延时

定时器中断延时利用了定时器的高精度特性,通过配置定时器中断来实现精确延时,这种方式虽然精度高,但频繁的中断可能会影响系统性能,特别是在其他中断中调用此延时函数时,以下是基于STM32 SysTick定时器的实现示例:

// 初始化SysTick定时器为1ms中断一次
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
// 延时函数
void Delay(__IO uint32_t nTime) {
    TimingDelay = nTime;
    while(TimingDelay != 0);
}
// SysTick中断服务函数
void SysTick_Handler(void) {
    if (TimingDelay != 0x00) {
        TimingDelay--;
    }
}

三、查询定时器延时

为了解决定时器频繁中断的问题,可以采用查询定时器的方式来实现延时,这种方式既能保证精度,又能避免频繁中断,以下是基于STM32 SysTick定时器的查询实现示例:

void delay_us(u32 nus) {
    u32 temp;
    SysTick->LOAD = 9 * nus;
    SysTick->VAL = 0X00; //清空计数器
    SysTick->CTRL = 0X01; //使能,减到零无动作,采用外部时钟源
    do {
        temp = SysTick->CTRL; //读取当前倒计数值
    } while((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
    SysTick->CTRL = 0x00; //关闭计数器
    SysTick->VAL = 0X00; //清空计数器
}
void delay_ms(u16 nms) {
    u32 temp;
    SysTick->LOAD = 9000 * nms;
    SysTick->VAL = 0X00; //清空计数器
    SysTick->CTRL = 0X01; //使能,减到零无动作,采用外部时钟源
    do {
        temp = SysTick->CTRL; //读取当前倒计数值
    } while((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
    SysTick->CTRL = 0x00; //关闭计数器
    SysTick->VAL = 0X00; //清空计数器
}

四、操作系统提供的延时函数

在有操作系统的环境中,可以直接使用操作系统提供的延时函数,如Windows平台的Sleep函数和POSIX兼容系统的usleepnanosleep函数,这些函数提供了更高层次的延时控制,使用方便且精度较高,以下是usleep函数的示例:

#include <unistd.h> // for usleep function
#include <stdio.h>
int main() {
    printf("Starting delay...
");
    usleep(1000000); //延时1000000微秒(1秒)
    printf("Delay ended
");
    return 0;
}

延时函数在编程中扮演着重要角色,不同的延时方法适用于不同的应用场景,循环延时简单易行但精度较低;定时器中断延时精度高但可能影响系统性能;查询定时器延时结合了两者优点;操作系统提供的延时函数则更加方便和高效,在选择延时方法时,需要根据具体需求进行权衡。

打赏
版权声明:主机测评不销售、不代购、不提供任何支持,仅分享信息/测评(有时效性),自行辨别,请遵纪守法文明上网。
文章名称:《什么是延时函数?它如何工作?》
文章链接:https://www.yunzhuji.net/yunfuwuqi/285853.html

评论

  • 验证码