下面的步骤记录freertos的调试过程。这里的调试方法主要是教会大家如何
获取任务的执行情况,通过获取的任务信息,可以进一步的配置和优化工
程,这种方法非常实用,建议初学者必须掌握。
很多时候,我们需要了解任务的执行状态,任务栈的使用情况以及各个任务
的 CPU 使用率,这时就需要用到官方提供的两个函数 vTaskList 和
vTaskGetRunTimeStats。用户就可以通过这两个函数获得任务的执行情
况。获取了任务执行情况后,可以通过串口将其打印出来,当然,也可以通
过任何其它方式将其显示出来。
本教程配套的例子统一采用串口打印的方式显示任务的执行情况。另外有一
点要特别注意,这种调试方式仅限测试目的,实际项目中不要使用,这种测
试方式比较影响系统实时性。
1、配置freertosconfig.h
extern volatile uint32_t ulHighFrequencyTimerTicks;
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulHighFrequencyTimerTicks = 0ul)
#define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks
2、利用stm32内部的定时器产生一个50us的定时器中断
void Timer2_Configuration(void )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2 ,ENABLE );
TIM_DeInit (TIM2 );//¸´Î»
TIM_InternalClockConfig(TIM2);//
TIM_TimeBaseStructure.TIM_Period =100-1;//
TIM_TimeBaseStructure .TIM_Prescaler =36-1;//
TIM_TimeBaseStructure .TIM_ClockDivision =TIM_CKD_DIV1 ;//
TIM_TimeBaseStructure .TIM_CounterMode =TIM_CounterMode_Up ;//
TIM_TimeBaseInit (TIM2 ,&TIM_TimeBaseStructure );
TIM_ClearFlag(TIM2,TIM_FLAG_Update );//
TIM_ARRPreloadConfig (TIM2,DISABLE );//
TIM_ITConfig (TIM2,TIM_IT_Update ,ENABLE );//
TIM_Cmd(TIM2,ENABLE);
NVIC_InitStructure .NVIC_IRQChannel =TIM2_IRQn ;
NVIC_InitStructure .NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitStructure .NVIC_IRQChannelSubPriority =0;
NVIC_InitStructure .NVIC_IRQChannelCmd =ENABLE ;
NVIC_Init(&NVIC_InitStructure );
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus (TIM2 ,TIM_IT_Update )!=RESET )
{
TIM_ClearITPendingBit (TIM2 ,TIM_IT_Update );
ulHighFrequencyTimerTicks ++;
Timer2_Over_Flag =1;
}
}
3、打印相关信息
可以设置为定时打印。
printf("=======================================================\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\n任务名 运行计数 使用率\r\n");
vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
4、效果