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

How to use vApplicationTickHook() function to measure task execution time in freeRTOS?

本文关键字:函数 测量 执行时间 任务 vApplicationTickHook freeRTOS      更新时间:2023-10-16

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

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

我理解了增加优先级的函数的功能,但不理解如何衡量任务执行时间。这个问题特别要求我们使用vApplicationTickHook(void)函数来这样做。任何提示将不胜感激。我也在课程的讨论区发了帖子,但是没有得到任何回复,所以就在这里发了。

首先让我在回答之前评论一下,这个问题的要求很奇怪,我在实践中从来没有遇到过。这可能是一个有用的练习,以熟悉FreeRTOS。但我绝不会在真正的项目中这么做。相反,我会更合理地设计任务。

vApplicationTickHook()周期性运行,每隔一秒运行一次。它从计时器ISR的上下文中运行,因此它甚至可以抢占高优先级任务a。由于它定期运行,我们可以使用它来轮询所需的信息。FreeRTOS包含许多任务实用程序,其中一个可能提供一些相关信息。

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