freertos学习-4 调试
来源:互联网 发布:kms命令激活windows 7 编辑:程序博客网 时间:2024/06/05 02:59
下面的步骤记录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、效果
阅读全文