目录
1.2 portGET_RUN_TIME_COUNTER_VALUE()
1.3 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
一. 函数介绍
/*此函数用于统计任务的运行时间信息*/
void vTaskGetRunTimeStats( char *pcWriteBuffer )
参数介绍
形参 | 描述 |
pcWriteBuffer | 接收任务运行时间信息的缓存指针 |
1.1时间统计API函数-使用流程
1.将宏configGENERATE_RUN_TIME_STATS 置1
2.将宏 configUSE_STATS_FORMATTING_FUNCTIONS置1
3.还需要实现2个宏定义:
① portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()用于初始化用于配置任务运行时间统计的时基定时器
(时基定时器用于统计任务的运行时间);
注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍(即0.1ms~0.01ms,也就是10us~100us)!
② portGET_RUN_TIME_COUNTER_VALUE()用于获取该功能时基硬件定时器计数的计数值 。
1.2 portGET_RUN_TIME_COUNTER_VALUE()
#define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOSRunTimeTicks //获取时间统计时间值
1.3 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimeForRunTimeStats()//定时器3提供时间统计的时基,频率为10K,即周期为100us
//初始化TIM3使其为FreeRTOS的时间统计提供时基
void ConfigureTimeForRunTimeStats(void)
{
//定时器3初始化,定时器时钟为72M,分频系数为72-1,所以定时器3的频率
//为72M/72=1M,自动重装载为50-1,那么定时器周期就是50us
TIM3_Int_Init(10-1,72-1); //初始化TIM3,10us
FreeRTOSRunTimeTicks = 0;
}
由于TIM3的时钟来源是72MHz,预分频设置72-1,自动重装载值设置为10-1,
定时器溢出时间为(10-1+1) * (72-1+1)/72,000,000=1/100,000ms = 10us,即为系统时钟节拍的一百倍。
1.3.1 修改定时器中断函数
使得每次中断将FreeRTOSRunTimeTicks的值自加1,用以记录任务运行的时间。
//FreeRTOS时间统计所用的节拍计数器
volatile unsigned long long FreeRTOSRunTimeTicks;
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
FreeRTOSRunTimeTicks++;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
}
}
二. 打印的结果
Task: 任务名称
Abs Time:任务实际运行的总时间(绝对时间,这里单位不一定是秒,需要根据定时器的中断频率再乘以运行的时间数值)
% Time:占总处理时间的百分比
该函数主要用于调试阶段,查看空闲任务所占运行百分比及个别任务运行时间所占百分比,然后看是否个别任务运行时间占比较大,是否需要拆分。