这里写自定义目录标题 背景 配置 FreeRTOSCconfig.h 统计时钟源 任务中打印
背景
本文直接讲解如果快速实现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 ) ; }
}