单片机延时的相关概念和分类

电子说

1.3w人已加入

描述

在嵌入式项目中,软件开发基本上都会使用到延时,那么,该用软件延时还是硬件延时?它们又有什么区别呢?

 

今天,我们就来讲讲关于硬件延时和软件延时的内容,以及二者的区别。

 

硬件和软件延时

延时的种类很多,先给大家普及一下延时相关概念和分类。

 

1、硬件延时

 

硬件延时是指利用具有计数功能的硬件进行延时。

 

比如:定时器(Timer)、 实时时钟(RTC)、 系统滴答定时器(SysTick)等具有计数功能的硬件。

 

2、软件延时

 

相对硬件延时而言,软件延时就是写一段软件代码,通过消耗CPU时间进行延时。

 

比如软件延时函数:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void Delay(uint32_t Cnt){  uint32_t i;
  while(Cnt--)  {    for(i=0; i<0x80000; i++);  }}

 

阻塞和非阻塞延时

在实际应用中,延时分阻塞和非阻塞延时。

 

1、阻塞延时

 

阻塞延时是指CPU一直停留阻塞,不去做其它事情,直到延时结束结束。

 

像上面那个软件延时(Delay)就是一个典型的阻塞延时,一直消耗CPU,直到延时结束。

 

2、非阻塞延时

 

非阻塞延时是指在延时期间没有阻塞CPU,也就是说,CPU在延时期间可以执行其它代码。

 

比如:利用定时器中断延时,只需要开启定时器,在中断(计数)到来之前,CPU可以执行其它代码。

 

3、额外举例

 

a. 利用定时器也能实现阻塞延时,比如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 < HAL_MAX_DELAY)  {    wait += (uint32_t)(uwTickFreq);  }
  while ((HAL_GetTick() - tickstart) < wait)  {  }}

 

b. 利用RTOS自带的系统延时实现非阻塞延时,这个实现原理实际是利用了硬件延时(系统滴答定时器)。

 

当然,这个延时的原理(延时函数代码)相对比较复杂,对于普通用户只需要知道如何调用以及简单原理即可,感兴趣的老铁可以自行研究一下。

 

通常在一些RTOS的(Demo)例子的任务中都有系统延时,比如ucos非阻塞延时:

 

  •  
OSTimeDly(10);

 

单片机

 

再比如FreeRTOS非阻塞延时:

 

  •  
vTaskDelay(10);

 

单片机

 

硬件和软件延时区别

通过以上分析,其实不难得出,硬件延时相对软件延时更普遍。

软件相对硬件延时精度更差;软件延时为阻塞延时,硬件延时可阻塞,也可非阻赛延时;硬件延时应用更灵活、更广泛......

 

在实际应用中,硬件延时、非阻塞延时相更普遍。

 
原文标题:一文弄懂单片机硬件与软件延时的区别

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分