背景
- 本文直接讲解如果快速实现freertos打印任务运行时间,堆栈使用情况等调试信息,不讲解原理。
配置
FreeRTOSCconfig.h
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configGENERATE_RUN_TIME_STATS 1
extern volatile unsigned long long g_runTime;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (g_runTime = 0)
#define portGET_RUN_TIME_COUNTER_VALUE() g_runTime
统计时钟源
- 使用任务运行时间信息统计功能,需要一个精度是系统时钟节拍精度10倍以上的时间基准。
- demo使用定时器TIM2来作为时间基准。
void TIM2_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=100 -1 ;
TIM_TimeBaseInitStructure.TIM_Prescaler=90 -1 ;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,ENABLE);
}
volatile unsigned long long g_runTime;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
g_runTime++;
}
}
任务中打印
- 在某一个任务中,打印使用情况,注意大数组对本任务堆栈的影响
void eobd_task(void *Para)
{
char pcTaskInfo[300];
for (;;)
{
vTaskList(pcTaskInfo);
printf("任务名 任务状态 优先级 剩余堆栈大小 任务号 \r\n");
printf("%s\r\n",pcTaskInfo);
vTaskGetRunTimeStats(pcTaskInfo);
printf("任务名\t\t运行时间\t\t百分比\t\t \r\n");
printf("%s\r\n",pcTaskInfo);
vTaskDelay(1000);
}
}