如何在freeRTOS中使用vApplicationTickHook()函数来测量任务执行时间
How to use vApplicationTickHook() function to measure task execution time in freeRTOS?
我参加了一个实时系统的在线课程,其中使用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的优先级了。
相关文章:
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 用于测量重载运算符和成员函数的时间的函数
- C++ 测量重复调用的函数的时间
- 尝试构造包装器测量函数调用时间时出现问题
- 模式匹配函数的时间测量无法正常工作
- 测量将参数传递到函数所需的时间
- 测量其他类中函数的时间
- 测量函数调用期间的最大内存使用量
- 使用Clock()函数测量程序的运行时间
- 测量C 中函数调用的执行时间
- 测量cpp中的函数内存使用情况
- 如何测量Arduino函数的执行速度?
- 我的类包含 1 个枚举、2 个 int 和一个指针。它没有虚函数,但测量 20 字节。为什么?
- C++测量函数调用和回调之间的时间
- 如何测量c++中特定函数的运行时间{非常准确}
- 是否有一种方法可以测量特定函数从堆栈中消耗了多少内存?
- 在c++中做实验时,测量某些函数的cpu时间的最佳方法是什么?
- 我如何测量我的函数的时间,只有我的函数在使用CPU
- 如何在freeRTOS中使用vApplicationTickHook()函数来测量任务执行时间
- c++ STL:为什么STL数据结构不提供测量内存消耗的函数?