电子产业一站式赋能平台

PCB联盟网

搜索
查看: 122|回复: 0
收起左侧

揭秘:单片机硬件与软件延时之大不同!

[复制链接]

481

主题

481

帖子

2845

积分

三级会员

Rank: 3Rank: 3

积分
2845
发表于 2024-7-25 08:00:00 | 显示全部楼层 |阅读模式
在嵌入式项目中,软件开发基本上都会使用到延时,那么,该用软件延时还是硬件延时?它们又有什么区别呢?
今天就来讲讲关于硬件延时和软件延时的内容,以及它们的区别。

一、硬件和软件延时

延时的种类很多,先给大家普及一下延时相关概念和分类。
硬件延时:
指利用具有计数功能的硬件进行延时。比如:定时器(Timer)、 实时时钟(RTC)、 系统滴答定时器(SysTick)等具有计数功能的硬件。
软件延时:相对硬件延时而言,软件延时就是写一段软件代码,通过消耗CPU时间进行延时。比如软件延时函数:
  • void Delay(uint32_t Cnt){  uint32_t i;
      while(Cnt--)  {    for(i=0; i  }}
    二、阻塞和非阻塞延时

    实际应用中,延时分阻塞和非阻塞延时。阻塞延时:指CPU一直停留阻塞,不去做其它事情,直到延时结束结束。像上面那个软件延时(Delay)就是一个典型的阻塞延时,一直消耗CPU,直到延时结束。
    非阻塞延时:
    指在延时期间,没有阻塞CPU,也就是说CPU在延时期间可以执行其它代码。
    比如:利用定时器中断延时,只需要开启定时器,在中断(计数)到来之前,CPU可以执行其它代码。
    额外举例:
    利用定时器也能实现阻塞延时,比如STM32的HAL自带的阻塞延时:
  • __weak void HAL_Delay(uint32_t Delay){  uint32_t tickstart = HAL_GetTick();  uint32_t wait = Delay;
      /* Add a freq to guarantee minimum wait */  if (wait   {    wait += (uint32_t)(uwTickFreq);  }
      while ((HAL_GetTick() - tickstart)   {  }}利用RTOS自带的系统延时实现非阻塞延时,这个实现原理实际是利用了硬件延时(系统滴答定时器)。当然,这个延时的原理(延时函数代码)相对比较复杂,对于普通用户只需要知道如何调用以及简单原理即可,感兴趣的老铁可以自行研究一下。
    通常在一些RTOS的(Demo)例子的任务中都有系统延时,比如ucos非阻塞延时:
  • OSTimeDly(10);

    qbxb0cf3s4d6402037246.png

    qbxb0cf3s4d6402037246.png


    再比如FreeRTOS非阻塞延时:
  • vTaskDelay(10);

    vdxsiv1qzhn6402037346.png

    vdxsiv1qzhn6402037346.png

    关于RTOS的延时,这里额外拓展一下关于RTOS中的相对延时和绝对延时的内容,请移步至文章《RTOS中相对延时和绝对延时的区别

    三、阻塞和非阻塞延时

    通过以上分析,其实不难得出,硬件延时相对软件延时更普遍。
    1.软件相对硬件延时精度更差;2.软件延时为阻塞延时,硬件延时可阻塞,也可非阻赛延时;
    3.硬件延时应用更灵活、更广泛;
    ......实际应用中,硬件延时、非阻塞延时相对更普遍。

    amd0qveepmu6402037446.png

    amd0qveepmu6402037446.png

                  欢迎转发分享给需要的好友!!!

    tq3yvri0kpf6402037546.png

    tq3yvri0kpf6402037546.png

    微信号:zls_it
    扫描下方二维码添加充电站小助手微信,可以加入微信交流群群内每天分享一些大厂的经典C语言语、C++面试题及知识点解析、技术话题分
    享,易混淆的概念答疑等,等你来GET!!!

    h3rbt11jniq6402037646.png

    h3rbt11jniq6402037646.png
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表