当前位置: 首页 > 文档资料 > freeRTOS 使用教程 >

1.4.5 运行时间统计

优质
小牛编辑
126浏览
2023-12-01

简介

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

可以提供:

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

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

配置与使用

需要三个宏,定义在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()获取当前值。

extern volatile unsigned long ulHighFrequencyTimerTicks;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL )
#define portGET_RUN_TIME_COUNTER_VALUE()    ulHighFrequencyTimerTicks