当前位置: 首页 > news >正文

单片机阻塞延时与非阻塞延时(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)是整个大循环,大循环内任务越多,单次运行时间就越长,基本时基越来越大,这样造成了延时的时间不稳定。

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

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

下次更新再来一起学习。

相关文章:

  • Kubernetes 入门
  • 深入探讨YOLOv8 网络架构
  • 【NLP】一种基于联合方式的三元组抽取模型——CasRel
  • 接口自动化测试-python-笔记
  • OpenPPL PPQ量化(3):量化计算图的加载和预处理 源码剖析
  • ES6 简介(二)
  • Spring Boot 最新版3.x 集成 OAuth 2.0实现认证授权服务、第三方应用客户端以及资源服务
  • ESP32开发板Arduino IDE更新指南
  • 【day4】 谷粒商城-前端相关(不全,没认真看)
  • 程序编译的过程
  • Spring由哪些模块组成
  • 单链表反转C语言代码
  • Visual Paradigm 17.X Crack
  • 【微服务】RabbitMQ高级篇
  • Dubbo-----------------项目整合和分析
  • ROS2 入门应用 工作空间
  • AOSP 8.0 系统启动之四ART虚拟机启动(一)
  • 1079 Total Sales of Supply Chain
  • 基于DemonSet方式收集容器日志输出实践
  • 牛客网:JZ65 不用加减乘除做加法(详解)
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉