前不久有一个读者问了一个关于延时的问题,大致是询问:软件延时和硬件延时是什么意思,以及在项目开发中它们有什么区别。
今天我就来谈谈关于硬件延时和软件延时的内容,以及它们之间的区别。
硬件和软件延时
延时有很多种类,让我先给大家介绍一下延时的相关概念和分类。
1. 硬件延时
硬件延时指的是利用具有计数功能的硬件来实现延时功能。
比如:定时器(Timer)、实时时钟(RTC)、系统滴答定时器(SysTick)等具有计数功能的硬件。
2. 软件延时
相对于硬件延时,软件延时指的是通过编写一段软件代码来实现延时,其原理是通过消耗CPU时间来进行延时操作。
比如软件延时函数:
void Delay(uint32_t Cnt)
{
uint32_t i;
while(Cnt--)
{
for(i=0; 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 wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) wait)
{
}
}
b.利用RTOS自带的系统延时实现非阻塞延时,这个实现原理实际是利用了硬件延时(系统滴答定时器)。
当然,这个延时的原理(延时函数代码)相对比较复杂,对于普通用户只需要知道如何调用以及简单原理即可,感兴趣的老铁可以自行研究一下。
通常在一些RTOS的(Demo)例子的任务中都有系统延时,比如ucos非阻塞延时:
OSTimeDly(10);
![image-20231103203818286](https://pic.imgdb.cn/item/6544e9e8c458853aef8c0359.png)
再比如FreeRTOS非阻塞延时:
vTaskDelay(10);
![image-20231103203823204](https://pic.imgdb.cn/item/6544e9e8c458853aef8c0348.png)
关于RTOS的延时,这里额外拓展一下关于RTOS中的相对延时和绝对延时的内容,请移步至文章《RTOS中相对延时和绝对延时的区别》
硬件和软件延时区别
通过以上分析,其实不难得出,硬件延时相对软件延时更普遍。
1.软件相对硬件延时精度更差;
2.软件延时为阻塞延时,硬件延时可阻塞,也可非阻赛延时;
3.硬件延时应用更灵活、更广泛;
……
实际应用中,硬件延时、非阻塞延时相对更普遍。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !
![137e00002230ad9f26e78-265x300](https://pic.imgdb.cn/item/6544e9e8c458853aef8c036a.png)