在公众号列表中,长按我的公众号,置顶公众号,就可以随时看到我。

相信许多朋友都有过这么一个需求:固定一个时间(周期)去处理某一件事情。

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

你会通过什么方式解决呢?

解决办法

很多人肯定首先想到的是:利用定时器,定时10ms中断,在中断里面处理。这种利用定时器中断解决的办法,在处理程序耗时很短(微秒级一下)的情况下是可以的。但是,如果处理程序耗时较长(几十微妙,甚至毫秒级),显然在中断里面处理不现实。因此,就引出了今天的绝对延时。在实时操作系统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)。如果打断时间太长,回来之后延时都超过了,则会立马执行程序,不会再延时(任务不会再阻塞延时)。这次应该能理解了吧?

————————————————
版权声明:本文为CSDN博主「ybhuangfugui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ybhuangfugui/article/details/99826764

https://blog.csdn.net/ybhuangfugui/article/details/99826764

FreeRTOS中相对延时和绝对延时的区别相关推荐

  1. RTOS中相对延时和绝对延时的区别

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 相信许多朋友都有过这么一个需求:固定一个时间(周期)去处理某一件事情. 比如:固定间隔10ms去采集 ...

  2. iOS中常用的几种延时加载/执行的处理办法

    在开发过程中 我们会常常需要用到这样的延迟处理这种技术 那么, 一般你们会怎么去做这样的一个延时操作呢? 比如, 用户登录成功以后,提示登录成功,然后再将控制器从登录页切到主页 又或是,等待一个动画完 ...

  3. c#语言中怎么实现延时功能,timer-在C#中创建“一次运行”延时功能的最佳方法...

    timer-在C#中创建"一次运行"延时功能的最佳方法 我正在尝试创建一个接受Action和Timeout并在Timeout之后执行Action的函数. 该功能是非阻塞的. 该函数 ...

  4. 【SpringBoot】43、SpringBoot中整合RabbitMQ实现延时队列(延时插件篇)

    死信队列实现篇,参考文章:[SpringBoot]60.SpringBoot中整合RabbitMQ实现延时队列(死信队列篇) 一.介绍 1.什么是延时队列? 延时队列即就是放置在该队列里面的消息是不需 ...

  5. 单片机硬件和软件延时、RTOS相对延时和绝对延时

    已剪辑自: https://mp.weixin.qq.com/s/-RPLQn4KO9Aqu1fpfZeOKA 前不久有个读者在问关于延时的问题,大概就是问:软件延时和硬件延时是啥意思?做项目时他俩有 ...

  6. 正点原子FreeRTOS(中)

    更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进入------ ...

  7. Atitit 为什么网络会有延时 电路交换与分组交换的区别

    Atitit 为什么网络会有延时 电路交换与分组交换的区别 按道理,网络是电子设备联网,应该达到光速才对.. 本质上因为互联网基于分组交换而不是电路交换. 分组交换相当于队列方式,别人发你的数据包先存 ...

  8. matlab怎样编写延时函数,编写延时函数的简单方法

    原标题:编写延时函数的简单方法 如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.可以验证你的 这里用一个 ...

  9. c语言不用死等的延时函数,matlab延时函数怎么写

    1. c语言延时函数delay,怎么算延时 下面是delay 函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为 ...

最新文章

  1. 排插老化再酿祸端,安全新国标排插首选品胜
  2. java语言程序设计考点_计算机二级考试Java语言程序设计考点:关键字
  3. android开发环境搭建(for 驱动开发人员)
  4. 框架:Mybatis开发规范及输入输出映射配置时注意事件
  5. matlab中now函数_now()方法以及JavaScript中的示例
  6. centos5.5安装ispcp
  7. python中逻辑运算_Python 逻辑运算之 'and' 和 'or'
  8. Mysql text类型的最大长度
  9. 创建文本节点createTextNode
  10. 调用平安银行接口返回GBK乱码问题
  11. 中国油页岩资源开发利用行业前景动态及未来发展趋势预测报告(2022-2027年)
  12. 多电压等级计算机潮流计算,电力系统潮流计算
  13. java 纳秒 毫秒,秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)及Java获得
  14. 2021字节秋招算法岗面经——抖音推荐
  15. linux搭建tht框架,教程 中标麒麟linux硬盘安装图解
  16. 清华大学2020年“姚班”“智班”报考指南及选拔方案发布!
  17. Excel文件导出,前端导出或者后端导出
  18. C++面向对象(三):类和对象
  19. 5oSf6KeJ5Lul5ZCO5Y+v5Lul55SoYmFzZTY05Yqg5a+G6ZqP56yU
  20. c语言精髓之编译过程,C语言精髓知识点

热门文章

  1. 像素旋转:一种在加密图像中实现安全的可逆数据隐藏方案
  2. 0x30数学知识(0x38 概率与数学期望)例题3:扑克牌(题解)
  3. Cron 表达式详解及最新版本使用
  4. 试题 算法提高 Monday-Saturday质因子
  5. python技术介绍_Python介绍
  6. 西安python招聘信息_中软国际(陕西西安)2017招聘启事
  7. 二叉树的公共祖先问题
  8. LOJ #573. 「LibreOJ NOI Round #2」单枪匹马 线段树
  9. Azure DevOps —— Azure Artifacts 包管理平台
  10. 空中群体机器人研究综述