1281_FreeRTOS_vTaskDelayUntil实现分析

本文深入解析FreeRTOS中vTaskDelayUntil的实现,对比vTaskDelay,探讨两者在延迟精度上的差异。pxPreviousWakeTime参数用于指定时间基准,vTaskDelayUntil允许指定参考点,提供更精确的延迟控制。在高优先级任务抢占情况下,两者的精准度可能受影响。文章通过代码示例展示了如何使用这两个接口,并讨论了在不同场景下选择合适接口的重要性。
摘要由CSDN通过智能技术生成

全部学习汇总: GreyZhang/g_FreeRTOS: learning notes about FreeRTOS. (github.com)

前面简单分析了vTaskDelay(),这一次分析一下vTaskDelayUntil()的实现。之前,看文档的时候模模糊糊记得vTaskDelayUntil()能够完成的延迟更加精准一些。这一次,从代码设计的角度来看看为什么。

这里的pxPreviousWakeTime实现的功能还是一个参数的传入功能,传入的是一个时间基准。当然,它本身是一个指针,传入的并不是一个数值参数。这里,关键的一点信息在于:1,调度器不能挂起; 2,唤醒时间定时设置。看上去,套路跟之前分析的vTaskDelay()没有太大的差异。

这里,区分了tick是否超时。在每一种情况下,都判断了延时时间是否已经达到。如果达到了,那么接下来直接请求任务调度即可。

其实,这部分的处理跟之前分析的vTaskDelay()的处理接口也是很相似的。其实,主要的方式就是加入到delayed task链表之后触发任务调度请求。

那么,这两个接口差异点究竟在哪里呢?为什么说vTaskDelay()不如vTaskDelayUntil()精准呢?其实,看完代码基本上也能够理解两者的差异。如果理解两者的差异,其实从函数的接口形式就能够看出一些端倪。两个接口的延时实现其实都是定时器设置一个参考值之后不断进行判断,但是这个参考点的设置是不同的。vTaskDelay()设置的参考点总是从当前开始,而vTaskDelayUntil()参考点的设置其实是可以指定的。

这是一个使用的代码例子,其实,我觉得这个例子实现的功能跟vTaskDelay()接口实现的功能也没有太大的差异。尤其是出现 某些高优先级任务抢占的时候。那么,如果才会让着两个接口实现有一定差异呢?那肯定是参考点的设置不断更新的时候,可能会存在更加灵活的方式。

这是针对例子的分析以及增加的一个对比。其实,不管是vTaskDelayUntil()还是vTaskDelay(),如果不断遭遇到运行时间久且优先级高的任务,本身的精准度肯定都会受到影响。毕竟到现在为止,并没有看到这样的任务优先级有提升。从这个角度讲,前面考虑到的差异点,其实2种接口都受到影响。排除这样的差异之后,这两个接口的差异可以理解为:vTaskDelay()设置的其实是时间等待,而vTaskDelayUntil()实现的是框定一个时间窗口。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值