加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

FreeRTOS中相对延时和绝对延时的区别

2020/12/04
267
阅读需 6 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

嵌入式软件代码中延时是很常见的,只是延时种类有很多,看你用什么延时。

一个延时的问题问题:周期性(固定一个时间)去处理某一件事情。你会通过什么方式去实现?

比如:间隔 10ms 去采集传感器的数据,然后通过一种算法计算出一个结果,最后通过串口发送出去。

可能对于很多习惯裸机编程的读者,首先想到的是:利用定时器,定时 10ms 中断,在中断里面处理。

中断函数适合处理简单数据,不适合算法、通信等需要长时间占用 CPU 的处理。

对计时精度要求比较高的地方适合定时器,像本章节说的周期性采集传感器数据,要求不适合很高,那么就引入本文说的绝对延时。

实时操作系统 FreeRTOS 任务中,利用 vTaskDelayUntil 绝对延时即可完美解决这个问题。

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

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

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

绝对延时:指每隔指定的时间(参数:滴答值),执行一次调用 vTaskDelayUntil()函数的任务。
文字描述可能不够直观理解,下面章节结合代码例子、延时值(IO 高低变化波形)、任务执行图来详细讲述一下他们的区别。

相对延时和绝对延时区别

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

相对延时代码:

绝对延时代码:

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

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

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

看到代码,你想到了他们输出结果的差异吗?来看下结果的差异:用 PA0 这个引脚输出的高低电平,得出延时时间。

相对延时结果:

绝对延时结果:

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

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

1. 相对延时先看任务执行图,按照上面代码的方式呈现:

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

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

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

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

2. 绝对延时

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

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

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

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

FreeRTOS

FreeRTOS

FreeRTOS 专职开发人员一直与芯片公司紧密合作, 为客户提供市场领先external_link以及免费的商用级、高品质 RTOS和工具。

FreeRTOS 专职开发人员一直与芯片公司紧密合作, 为客户提供市场领先external_link以及免费的商用级、高品质 RTOS和工具。收起

查看更多

相关推荐

电子产业图谱

作者黄工,从事嵌入式软件开发工作8年有余,高级嵌入式软件工程师,业余维护公众号『strongerHuang』,分享嵌入式软硬件、单片机、物联网等内容。