【问题标题】:How to use vApplicationTickHook() function to measure task execution time in freeRTOS?如何使用 vApplicationTickHook() 函数测量 freeRTOS 中的任务执行时间?
【发布时间】:2016-08-28 19:40:41
【问题描述】:

我参加了有关实时系统的在线课程,其中 FreeRTOS 用于演示 RTOS 的各种功能。我现在面临的问题如下:

  • 在主函数中创建了两个任务(A 和 B),并启动了实时调度程序。
  • 任务 B 的优先级低于任务 A。任务 B 需要每 n ms 安排一次,但由于任务 A 的优先级高于 B,因此 B 不会每 n ms 安排一次。
  • 因此,我们需要编写一个新函数,获取 A 和 B 的任务句柄并测量任务 B 的执行时间。
  • 如果B的执行时间超过n ms,则增加优先级。

我了解增加优先级的函数的功能,但不明白如何测量任务执行时间。该问题特别要求我们使用 vApplicationTickHook( void ) 函数来执行此操作。任何提示将不胜感激。我也在课程的论坛上发帖,但没有得到任何回复,因此在这里发布。

【问题讨论】:

  • FreeRTOS 文档 IIRC 中已经有一个示例。
  • 嗨,我浏览了 FreeRTOS 文档,但无法弄清楚。谢谢
  • 你的意思不是反过来吗?如果任务A(优先级较高)所用时间大于n,是否需要提高A的优先级?
  • 已编辑,谢谢。问题具体要求任务B。所以,任务B需要每n ms调度一次,我们需要看看执行时间是否超过n ms,那么它需要被赋予更高的优先级。我对执行时间和调度周期有点困惑,但这就是问题所在。
  • 您处于裸机级别,因此请考虑裸机:如果您想确保特定时间,而不是低优先级计划任务,请使用计时器。

标签: c++ c embedded rtos freertos


【解决方案1】:

首先让我先评论一下我的回答,即这个问题的要求很奇怪,而不是我在实践中遇到过的。这对于熟悉 FreeRTOS 可能很有用。但这不是我在真实项目中会做的事情。相反,我会更明智地设计任务。

vApplicationTickHook() 定期运行,每滴答一次。它从定时器 ISR 的上下文中运行,因此它甚至抢占了高优先级任务 A。由于它定期运行,我们可以使用它来轮询我们需要的信息。 FreeRTOS 包含许多Task Utilities,其中之一可能提供了一些相关信息。

我发现看起来很有用的第一件事是vTaskGetInfo() 返回一个指向TaskStatus_t 结构的指针,其中包含ulRunTimeCounter,即到目前为止分配给任务的总运行时间。因此,您可以从vApplicationTickHook() 调用vTaskGetInfo() 来轮询任务B 的总运行时间。记住任务 B 之前在本地静态变量中的运行时间,当它的运行时间没有增加 n 毫秒时,你就会知道是时候提高任务 B 的优先级了。

【讨论】:

  • 重要提示:此测量仅与您的操作系统滴答分辨率一样准确,可能低于 1 毫秒/滴答。鉴于强加的要求,这应该可行,但有更好的方法可以做到这一点。
  • 唯一的问题是 vApplicationTickHook 的文档明确指出“vApplicationTickHook() 从 ISR 中执行,因此必须非常短,不使用太多堆栈,并且不调用任何不结束的 API 函数在“FromISR”或“FROM_ISR”中 - 所以不要认为从这里调用 vTaskGetInfo 是明智的......
猜你喜欢
  • 2018-09-24
  • 2023-03-09
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2019-03-30
  • 2020-07-16
相关资源
最近更新 更多