FreeRTOS之打印CPU使用率

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值