如何使用vApplicationTickHook()函数来测量freeRTOS中的任务执行时间?

时间:2016-08-28 19:40:41

标签: c++ c embedded rtos freertos

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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