API函数:
1、获取任务信息
void vTaskList( char * pcWriteBuffer );
2、获取任务运行时间信息
void vTaskGetRunTimeStats( char *pcWriteBuffer );
此功能需要开启一个高于操作系统分辨率10倍的定时器。
FreeRTOSConfig.h
/********************************************************************
FreeRTOS与运行时间和任务状态收集有关的配置选项
**********************************************************************/
//启用运行时间统计功能
#define configGENERATE_RUN_TIME_STATS 1
//启用可视化跟踪调试
#define configUSE_TRACE_FACILITY 1
/* 与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
* prvWriteNameToBuffer()
* vTaskList(),
* vTaskGetRunTimeStats()
*/
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
/************打印CPU利用率 Start************/
extern volatile uint32_t CPU_RunTime;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (CPU_RunTime = 0ul)
#define portGET_RUN_TIME_COUNTER_VALUE() CPU_RunTime
/************打印CPU利用率 end**************/
/* 以下为使用Percepio Tracealyzer需要的东西,不需要时将 configUSE_TRACE_FACILITY 定义为 0 */
#if ( configUSE_TRACE_FACILITY == 1 )
//#include "trcRecorder.h"
//#define INCLUDE_xTaskGetCurrentTaskHandle 1 // 启用一个可选函数(该函数被 Trace源码使用,默认该值为0 表示不用)
#endif
定时器中断函数中添加如下代码:
/**
* @brief This function handles TIM2 interrupt request.
* @param None
* @retval None
*/
/* 用于统计运行时间 */
volatile uint32_t CPU_RunTime = 0UL;
void GENERAL_TIM_IRQHandler (void)
{
if ( TIM_GetITStatus( GENERAL_TIM, TIM_IT_Update) != RESET )
{
CPU_RunTime++;
TIM_ClearITPendingBit(GENERAL_TIM , TIM_FLAG_Update);
}
}
AppTask.c
#include "AppTask.h"
TaskHandle_t AppCreateTask_Handle = NULL;
static TaskHandle_t Task1_Handle = NULL;
static TaskHandle_t Task2_Handle = NULL;
static TaskHandle_t CPUTask_Handle = NULL;
static void Task1(void* parameter);
static void Task2(void* parameter);
static void CPU_Task(void* parameter);
/**************************************
* function:创建App任务函数
* parameter:void*
* return:void
* date:2022.3.21
* note:
* ***********************************/
void AppCreate_Task(void* parameter)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t) Task1,\
(const char*) "Task1",\
(uint16_t) 128,\
(void *)NULL,\
(UBaseType_t) 1,\
(TaskHandle_t *) Task1_Handle);
if(xReturn == pdPASS){printf("Task1 Create Succeed!\r\n");}
else{printf("Task1 Create Fail!");}
xReturn = xTaskCreate((TaskFunction_t) Task2,\
(const char*) "Task2",\
(uint16_t) 128,\
(void *)NULL,\
(UBaseType_t) 1,\
(TaskHandle_t *) Task2_Handle);
if(xReturn == pdPASS){printf("Task2 Create Succeed!\r\n");}
else{printf("Task2 Create Fail!");}
xReturn = xTaskCreate((TaskFunction_t) CPU_Task,\
(const char*) "CPU_Task",\
(uint16_t) 512,\
(void *)NULL,\
(UBaseType_t) 1,\
(TaskHandle_t *) CPUTask_Handle);
if(xReturn == pdPASS){printf("CPU_Task Create Succeed!\r\n");}
else{printf("CPU_Task Create Fail!");}
vTaskDelete(AppCreateTask_Handle);
taskEXIT_CRITICAL();
}
static void Task1(void* parameter)
{
while(1)
{
printf("Task1 Run...\r\n");
vTaskDelay(1000);
}
}
static void Task2(void* parameter)
{
while(1)
{
printf("Task2 Run...\r\n");
vTaskDelay(1000);
}
}
static void CPU_Task(void* parameter)
{
uint8_t CPU_RunInfo[400]; //保存任务运行时间信息
while (1)
{
memset(CPU_RunInfo,0,400); //信息缓冲区清零
vTaskList((char *)&CPU_RunInfo); //获取任务运行时间信息
printf("---------------------------------------------\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
printf("%s", CPU_RunInfo);
printf("---------------------------------------------\r\n");
memset(CPU_RunInfo,0,400); //信息缓冲区清零
vTaskGetRunTimeStats((char *)&CPU_RunInfo);
printf("任务名 运行计数 使用率\r\n");
printf("%s", CPU_RunInfo);
printf("---------------------------------------------\r\n\n");
vTaskDelay(1000); /* 延时500个tick */
}
}
AppTask.h
#ifndef _AppTask_H_
#define _AppTask_H_
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "event_groups.h"
#include "timers.h"
#include "bsp_led.h"
#include "bsp_usart.h"
#include "bsp_GENERALTim.h"
#include "string.h"
extern TaskHandle_t AppCreateTask_Handle;
extern void AppCreate_Task(void* parameter);
#endif
main.c
#include "AppTask.h"
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//优先级0-15
LED_GPIO_Config();
USART_Config();
GENERAL_TIM_Init();
}
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
xReturn = xTaskCreate((TaskFunction_t) (AppCreate_Task),
(const char*) "AppCreate_Task",
(uint16_t) 512,
(void*) NULL,
(UBaseType_t) 3,
(TaskHandle_t) (&AppCreateTask_Handle));
if(xReturn == pdPASS)
{
printf("AppCreate_Task Create Succeed!\r\n");
vTaskStartScheduler();//启动任务调度
}
else{printf("AppCreate_Task Create Fail!\r\n");}
while(1);
}
测试现象:
完整代码:链接:https://pan.baidu.com/s/1Yk1SSK0ecYzD6LJPtzquIg
提取码:lu5s