良许Linux教程网 干货合集 RTOS相对延时和绝对延时的区别

RTOS相对延时和绝对延时的区别

深度伪原创版本:

在嵌入式软件代码中,延时是一种非常常见的操作,只是延时的实现方式有很多,具体取决于你使用何种方式进行延时。

一个延时的问题

问题:如果要以固定的时间间隔来处理某个事件,你会选择哪种方式来实现?

举例来说:假设我们需要每隔10毫秒采集传感器数据,然后通过某种算法计算出一个结果,最后再通过串口发送出去。

对于许多习惯进行裸机编程的读者来说,首先可能会想到的是利用定时器,在定时器中断中完成相关处理操作。

然而,中断函数更适合处理简单的数据,而对于需要长时间占用CPU进行算法计算、通信等操作并不适用。

对于对计时精度要求较高的任务,使用定时器是合适的选择。但对于本文中提到的周期性传感器数据采集任务,对精度的要求并不太高,因此引入了本文所述的绝对延时解决方案。

在实时操作系统FreeRTOS的任务中,我们可以利用vTaskDelayUntil函数来实现绝对延时,以完美解决这个问题。

相对延时和绝对延时的含义

本文拿FreeRTOS中相对延时函数vTaskDelay,绝对延时函数vTaskDelayUntil来说明。

相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间(参数:滴答值)结束。

绝对延时:指每隔指定的时间(参数:滴答值),执行一次调用vTaskDelayUntil()函数的任务。

文字描述可能不够直观理解,下面章节结合代码例子、延时值(IO高低变化波形)、任务执行图来详细讲述一下他们的区别。

相对延时和绝对延时区别

以实际代码为例说明:一个任务中,添加一个10ms系统延时,然后,在执行任务(耗时1ms左右,例子以延时代替)。

相对延时代码:

image-20231106201031228
image-20231106201031228

绝对延时代码:

image-20231106201035629

说明:

**1.**TestDelay这个延时函数仅仅用于测试(延时1ms),用于代替采集、算法、发送等耗时时间。

**2.**两个代码唯一区别在于系统延时不同,一个vTaskDelay(10);,一个vTaskDelayUntil(&xLastWakeTime, 10);

**3.**系统时钟频率为1000,也就是上面系统延时10个滴答,即10ms。

看到代码,你想到了他们输出结果的差异吗?

来看下结果的差异:用PA0这个引脚输出的高低电平,得出延时时间。

相对延时结果:

image-20231106201039186
image-20231106201039186

绝对延时结果:

image-20231106201042292

结果为:相对延时的周期为系统延时10ms + 执行任务1ms的时间,总共11ms时间。绝对延时的周期即为10ms时间.

*换一种方式看区别*

如果上面的区别还没明白,再来讲一个更容易理解的区别,通过文字 + 任务执行图来说明。

1.相对延时

先看任务执行图,按照上面代码的方式呈现:

image-20231106201053111
image-20231106201053111

这里会牵涉到操作系统任务切换、高优先级任务抢占等一些原理,若不了解,请转移直到了解再回来。

上电,TEST任务进入延时(阻塞)状态,此时系统执行其他就绪任务。FreeRTOS内核会周期性的检查TEST任务的阻塞是否达到,如果阻塞时间达到,则将TEST任务设置为就绪状态,如果就绪任务中TEST任务的优先级最高,则会抢占CPU,再次执行任务主体代码,不断循环。

TEST任务每次系统延时都是从调用延时函数vTaskDelay()开始算起的,所以叫相对延时。

从上图可以看出:

如果执行TEST任务的过程中发生中断,或者具有更高优先级的任务抢占了,那么TEST任务执行的周期就会变长,所以使用相对延时函数vTaskDelay(),不能周期性的执行TEST任务。

2.绝对延时

image-20231106201057568

代码中定义的变量xLastWakeTime,其实是用来保存上一次的系统计数器值(方便检测下一个延时时间是否到来)。

和上面相对延时程序执行图比较,可以看出,系统延时的时间包含了程序执行的时间。即时中途有中断,或更高优先级任务打断,不会影响下一次执行的时间(也就是这个周期不会变,当然,打断时间不能超过系统延时值)。

提示:图片中添加了一段话:一般来说,程序执行时间要小于总间隔时间(10ms)。

如果打断时间太长,回来之后延时都超过了,则会立马执行程序,不会再延时(任务不会再阻塞延时)。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部