简介

freeRTOS可以统计每个任务的执行时间(绝对时间和百分比时间),vTaskGetRunTimeStats()API可以提供表格式的统计数据,如下图所示:

运行时间统计 - 图1

可以提供:

  • 绝对时间
    这是每个任务执行的总时间(处在运行态的时间),取决于用户选择的一个合适的时间基准。

  • 百分比时间
    任务执行时间占总时间的百分比

配置与使用

需要三个宏,定义在FreeRTOSConfig.h:

  1. configGENERATE_RUN_TIME_STATS
    将该设置项设置为1,将使能时间统计功能,当然,下面的两个宏同时也需要定义才能完整实现统计功能。

  2. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
    执行时间统计的需要一个比节拍中断更高精度的定时器,否则统计出来的数据在精度上可能是无用的。推荐这个定时器比节拍中断定时器快10到100倍,越快的定时器,精度越高,当然定时器的计数值也会更快的溢出。这个宏会在调度器开始时(vTaskStartScheduler())被自动调用。推荐开发者使用这个宏去配置一个合适的时间基准。

  3. portGET_RUN_TIME_COUNTER_VALUE()
    这个宏返回当前”时间”。

vTaskGetRunTimeStats()API将返回统计数据。

例子:

使用一个20KHz的测试定时器,定时器中断中会累加ulHighFrequencyTimerTicks的值,这个值使用portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()初始化为0,使用,
portGET_RUN_TIME_COUNTER_VALUE()获取当前值。

  1. extern volatile unsigned long ulHighFrequencyTimerTicks;
  2. #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL )
  3. #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks