单片机阻塞延时与非阻塞延时(1)

一.延时函数的定义

1.个人理解:通过执行一些无意义的指令,来达到拖延运行下一条指令时间的函数。

二.阻塞延时函数

1.独占性的延时函数,其在运行时,整个系统都将处于停滞的状态。不利于多任务并行,因为用阻塞延时函数的话,因为某一个任务的延时需求,而导致所有的任务都只能眼巴巴的看着,对单片机资源造成极大的浪费,同时也不利于项目的稳定实时运行。

2.例子:

void delay(unsigned int ms)
{
    unsigned int i,j;
    for(i=ms;i>0;i--)
    {
        for(j=124;j>0;j--);
    }
    
}

此时调用这个函数时,整个单片机都会等着这个函数时间耗完才继续执行。

关键条件指令:for函数

三.非阻塞延时

1.非独立性的延时函数,与阻塞函数相反,不会将整个系统都拉入停滞状态。

2.例子:

#define DELAY_TIME 5000
unsigned int u16_led_cnt;
unsigned int u8_led_delay_flag;

int main( )
{
u16_led_cnt=DELAY_TIME;
    while(1)
    {
        if(u16_led_cnt)
        {
             u16_led_cnt--;
            if(!u16_led_cnt)
            {
                u8_led_delay_flag=1;
            }
        }
        if(u8_led_delay_flag==1)
        {
            u8_led_delay_flag=0;
            u16_led_cnt=DELAY_TIME;
            task(....);
            
        }
    }
}

靠while(1)大循环,每次都执行一次就出去了,不会阻塞系统其他任务运行

关键条件指令:while,if

3.缺点:

 其实非阻塞函数这样操作是非常不精确的,因为while(1)是整个大循环,大循环内任务越多,单次运行时间就越长,基本时基越来越大,这样造成了延时的时间不稳定。

那么我们如何进行均匀,精确的非阻塞延时呢?

答案:定时器,借助硬件定时器来定义出多个软件定时器来满足各个不同任务延时的需求。

下次更新再来一起学习。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞赴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值