本文章讲述如何打印输出 FreeRTOS 系统当前的任务列表,任务状态优先级,使用率等信息。
一、vTaskList
使用 vTaskList() 函数以表格形式打印输出当前系统中所有信息
- 任务名
- 任务状态
- 优先级
- 剩余栈
- 任务序号
使用示例如下:
void app_main()
{
xTaskCreate(test_task, "test_task", 4096, NULL, 6, NULL);
static char InfoBuffer[512] = {0};
while (1) {
vTaskList((char *) &InfoBuffer);
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
printf("\r\n%s\r\n", InfoBuffer);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
对应 log 打印如下:
任务名 任务状态 优先级 剩余栈 任务序号
main R 1 2996 2
IDLE0 R 0 1232 3
test_task B 6 3460 5
Tmr Svc B 1 2684 4
esp_timer B 22 3632 1
二、vTaskGetRunTimeStats
使用 vTaskGetRunTimeStats() 打印输出每个任务的运行时间
- 任务名
- 运行计数
- 使用率
使用示例如下:
void app_main()
{
xTaskCreate(test_task, "test_task", 4096, NULL, 6, NULL);
static char InfoBuffer[512] = {0};
while (1) {
vTaskGetRunTimeStats((char *) &InfoBuffer);
printf("\r\n任务名 运行计数 使用率\r\n");
printf("\r\n%s\r\n", InfoBuffer);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
对应 log 打印如下:
任务名 运行计数 使用率
main 56475 <1%
IDLE0 4091951 48%
test_task 4328356 50%
Tmr Svc 35 <1%
esp_timer 17606 <1%
三、vTaskGetInfo
使用 vTaskGetInfo() 打印输出某个任务信息
- 任务名
- 任务编号
- 任务壮态
- 任务当前优先级
- 任务基优先级
- 任务堆栈基地址
- 任务堆栈历史剩余最小值
使用示例如下:
void task_info_printf(void)
{
//任务句柄
const TaskHandle_t TaskHandleTb[] =
{
TaskHandle1, TaskHandle2, TaskHandle3
};
//输出堆栈中剩余空间(bytes)的大小和执行过程中剩余空间的最小值
printf("===========");
printf("FreeHeapSize : %d %d(byte)", xPortGetFreeHeapSize(), xPortGetMinimumEverFreeHeapSize());
printf("===========\r\n");
for(int i = 0; i < sizeof(TaskHandleTb) / sizeof(TaskHandleTb[0]); ++i)
{
TaskStatus_t TaskStatus;
//获取任务信息
vTaskGetInfo(TaskHandleTb[i], &TaskStatus, pdTRUE, (eTaskState)eInvalid);
printf("任务名: %s\r\n", TaskStatus.pcTaskName);
printf("任务编号: %d\r\n", (int)TaskStatus.xTaskNumber);
printf("任务壮态: %d\r\n", TaskStatus.eCurrentState);
printf("任务当前优先级: %d\r\n", (int)TaskStatus.uxCurrentPriority);
printf("任务基优先级: %d\r\n", (int)TaskStatus.uxBasePriority);
printf("任务堆栈基地址: %#x\r\n", (int)TaskStatus.pxStackBase);
printf("任务堆栈历史剩余最小值:%d\r\n", TaskStatus.usStackHighWaterMark);
}
printf("======================================================\r\n");
vTaskDelay(1000);
}