首先更改FreeRTOSConfig.h文件的相关宏定义
//启用运行时间统计功能
#define configGENERATE_RUN_TIME_STATS 1
//启用可视化跟踪调试
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
再在该h文件添加:
extern volatile uint32_t CPU_RunTime;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (CPU_RunTime = 0ul)
#define portGET_RUN_TIME_COUNTER_VALUE() CPU_RunTime
主要涉及两个函数:
vTaskList( char * pcWriteBuffer )
这个函数主要是列出任务的信息,如任务名、任务状态、优先级、剩余栈大小、任务序号。
vTaskGetRunTimeStats( char *pcWriteBuffer )
这个函数主要统计任务的运行计数,CPU的使用率
完整代码:
/* 创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle;
/* LED_Task任务句柄 */
static TaskHandle_t LED_Task_Handle;
/* CPU_Ifo_Task任务句柄 */
static TaskHandle_t CPU_Ifo_Task_Handle;
static void AppTaskCreate(void);/* 用于创建任务 */
static void Bord_Init(void);/* 用于初始化板载相关资源 */
static void LED_Task(void* pvParameters);/* LED_Task任务实现 */
static void CPU_Ifo_Task(void* pvParameters);/* CPU_Ifo_Task任务实现 */
static void TIM6_Init(void);
int main(void)
{
/* 开发板硬件初始化 */
Bord_Init();
/* 创建AppTaskCreate任务 */
xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */
(const char* )"AppTaskCreate",/* 任务名字 */
(uint16_t )128, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */
/* 启动任务调度 */
vTaskStartScheduler();
while(1);
}
static void AppTaskCreate(void)
{
taskENTER_CRITICAL(); //进入临界区
/* 创建LED_Task任务 */
xTaskCreate((TaskFunction_t )LED_Task, /* 任务入口函数 */
(const char* )"LED_Task",/* 任务名字 */
(uint16_t )128, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )2, /* 任务的优先级 */
(TaskHandle_t* )&LED_Task_Handle);/* 任务控制块指针 */
/* 创建CPU_Ifo_Task任务 */
xTaskCreate((TaskFunction_t )CPU_Ifo_Task,/* 任务入口函数 */
(const char* )"CPU_Ifo_Task",/* 任务名字 */
(uint16_t )128, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )3, /* 任务的优先级 */
(TaskHandle_t* )&CPU_Ifo_Task_Handle);/* 任务控制块指针 */
vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
taskEXIT_CRITICAL(); //退出临界区
}
static void CPU_Ifo_Task(void* parameter)
{
u8 pcWriteBuffer[200];
for(;;)
{
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);
vTaskDelay(1500);
}
}
static void LED_Task(void* parameter)
{
for(;;)
{
LED_B_TOGGLE;
vTaskDelay(1000);
}
}
static void Bord_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
TIM6_Init();
/* 串口初始化 */
USART_Config();
LED_Config(LED_GPIO_PORT,LED_B_PIN);
}
static void TIM6_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct;
NVIC_InitTypeDef NVIC_InitTypeStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
NVIC_InitTypeStruct.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitTypeStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitTypeStruct);
TIM_TimeBaseInitTypeStruct.TIM_Prescaler = 71;
TIM_TimeBaseInitTypeStruct.TIM_Period = 999; //1ms
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitTypeStruct);
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM6,ENABLE);
}
最终输出信息: