[应用相关] 单片机硬件与软件延时区别

[复制链接]
910|0
 楼主| 呐咯密密 发表于 2024-2-26 10:10 | 显示全部楼层 |阅读模式
单片机延时是最用的一个功能,那么,该用软件延时还是硬件延时?它们又有什么区别呢?
今天就来讲讲关于硬件延时和软件延时的内容,以及它们的区别。硬件和软件延时
延时的种类很多,先给大家普及一下延时相关概念和分类。1.硬件延时指利用具有计数功能的硬件进行延时。
比如:定时器(Timer)、 [color=var(--weui-LINK)][url=]实时时钟[/url]
(RTC)、 系统滴答定时器(SysTick)等具有计数功能的硬件。

2.软件延时相对硬件延时而言,软件延时就是写一段软件代码,通过消耗CPU时间进行延时。
比如软件延时函数:

  1. void Delay(uint32_t Cnt)
  2. {
  3.   uint32_t i;

  4.   while(Cnt--)
  5.   {
  6.     for(i=0; i<0x80000; i++);
  7.   }
  8. }
阻塞和非阻塞延时实际应用中,延时分阻塞和非阻塞延时。
1.阻塞延时指CPU一直停留阻塞,不去做其它事情,直到延时结束结束。
像上面那个软件延时(Delay)就是一个典型的阻塞延时,一直消耗CPU,直到延时结束。

2.非阻塞延时指在延时期间,没有阻塞CPU,也就是说CPU在延时期间可以执行其它代码。
比如:利用定时器中断延时,只需要开启定时器,在中断(计数)到来之前,CPU可以执行其它代码。
3.额外举例a.利用定时器也能实现阻塞延时,比如[color=var(--weui-LINK)][url=]STM32[/url]的HAL自带的阻塞延时:

  1. __weak void HAL_Delay(uint32_t Delay)
  2. {
  3.   uint32_t tickstart = HAL_GetTick();
  4.   uint32_t wait = Delay;

  5.   /* Add a freq to guarantee minimum wait */
  6.   if (wait < HAL_MAX_DELAY)
  7.   {
  8.     wait += (uint32_t)(uwTickFreq);
  9.   }

  10.   while ((HAL_GetTick() - tickstart) < wait)
  11.   {
  12.   }
  13. }
b.利用RTOS自带的系统延时实现非阻塞延时,这个实现原理实际是利用了硬件延时(系统滴答定时器)。
当然,这个延时的原理(延时函数代码)相对比较复杂,对于普通用户只需要知道如何调用以及简单原理即可,感兴趣的老铁可以自行研究一下。
通常在一些RTOS的(Demo)例子的任务中都有系统延时,比如[color=var(--weui-LINK)][url=]ucos[/url]
非阻塞延时:
  1. OSTimeDly(10);
8378665dbf2e081823.png 再比如[color=var(--weui-LINK)][url=]FreeRTOS[/url]非阻塞延时: 2300165dbf2ee5216c.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

568

主题

4085

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部