1,查看任务运行状态:
- X:表示任务当前正在运行(eXecuting)。
- B:表示任务处于阻塞状态(Blocked),这意味着任务正在等待某个事件发生,比如等待信号量、互斥量、事件组、消息队列或者定时器。
- R:表示任务处于就绪状态(Ready),这意味着任务已经准备好运行,但是当前没有在运行,因为它被调度器分配给其他任务执行。
- S 是挂起态,表示任务进入了挂起的状态。
- D 是删除态。
2,查看任务相关任务cpu利用率
void vTaskGetRunTimeStats( char * pcWriteBuffer );
3,查看任务状态和优先级:
void vTaskList( char * pcWriteBuffer );
4,举例说明
#include "FreeRTOS.h"
#include "task.h"
#include<stdio.h>
void vApplicationMallocFailedHook() {
while(1);
}
void vApplicationStackOverflowHook(TaskHandle_t xTask, char * pcTaskName ) {
while(1);
}
#include "semphr.h"
// 用于任务调用的宏定义
#define mainDELAY_LOOP_COUNT ( 0xffffff )
// 定义任务句柄
TaskHandle_t xTask1Handle = NULL;
TaskHandle_t xTask2Handle = NULL;
// 定义任务函数
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);
// 定义足够大的缓冲区用于存储统计信息
#define RUN_TIME_STATS_BUFFER_SIZE 2048
char runTimeStatsBuffer[RUN_TIME_STATS_BUFFER_SIZE];
int main(void)
{
// 创建任务
xTaskCreate(vTask1, "Task 1", 1000, NULL, 0, &xTask1Handle);
xTaskCreate(vTask2, "Task 2", 1000, NULL, 0, &xTask2Handle);
// 启动调度器
vTaskStartScheduler();
// 如果一切正常,以下代码不会被执行
for (;;)
{
}
return 0;
}
void vTask1(void *pvParameters)
{
const TickType_t xDelay = pdMS_TO_TICKS(20);
unsigned char pcWriteBuffer[500];
for (;;)
{
printf("================vTask1=================================\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
// 任务代码...
vTaskDelay(xDelay);
}
}
void vTask2(void *pvParameters)
{
const TickType_t xDelay = pdMS_TO_TICKS(20);
unsigned char pcWriteBuffer[500];
for (;;)
{
printf("=================vTask2================================\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(xDelay);
}
}
================vTask1=================================
任务名 任务状态 优先级 剩余栈 任务序号
Task 1 X 0 995 1
IDLE R 0 123 3
Task 2 B 0 995 2
Tmr Svc B 1 251 4=================vTask2================================
任务名 任务状态 优先级 剩余栈 任务序号
IDLE R 0 123 3
Task 2 X 0 995 2
Task 1 R 0 995 1
Tmr Svc B 1 251 4
任务名 运行计数 使用率
Task 2 37 1%
Task 1 15 <1%
IDLE 3328 100%
Tmr Svc 0 <1%
调整延时时间和优先级,可以复现cpu占用过高的问题,所以我们在加延时处理时要合理添加延时时间。
int main(void)
{
// 创建任务
xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, &xTask1Handle);
xTaskCreate(vTask2, "Task 2", 1000, NULL, 1, &xTask2Handle);
// 启动调度器
vTaskStartScheduler();
// 如果一切正常,以下代码不会被执行
for (;;)
{
}
return 0;
}
void vTask1(void *pvParameters)
{
const TickType_t xDelay = pdMS_TO_TICKS(5);
unsigned char pcWriteBuffer[500];
for (;;)
{
printf("================vTask1=================================\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(xDelay);
}
}
void vTask2(void *pvParameters)
{
const TickType_t xDelay = pdMS_TO_TICKS(5);
unsigned char pcWriteBuffer[500];
for (;;)
{
printf("=================vTask2================================\r\n");
printf("\r\n 任务名 运行计数 使用率\r\n");
vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
// 任务代码...
vTaskDelay(xDelay);
}
}
标签:pcWriteBuffer,void,RTOS,char,任务,实时操作系统,printf,Task,性能 From: https://blog.csdn.net/qq_40008325/article/details/142028033=================vTask2================================
任务名 运行计数 使用率
Task 2 196 98%
Task 1 8 4%
IDLE 0 <1%
Tmr Svc 0 <1%