官方文档参考
96 2.13 vTaskList()
[[FreeRTOS_Reference_Manual_V10.0.0.pdf#page=96&selection=0,2,4,11|FreeRTOS_Reference_Manual_V10.0.0, page 96]]
vTaskList函数
task.h
#include "FreeRTOS.h"
#include "task.h"
void vTaskList( char *pcWriteBuffer );
函数说明:
- 打印出系统里面所有的任务状态(
name, state, priority, stack, num),通过观察任务状态可以帮助我们做调试,了解系统的运行状态。
Name:
任务创建时给予的名字。
State:
- 'X'表示任务处于运行状态 。
- 'B'表示任务处于阻塞态。
- 'R'表示任务处于就绪态。
- 'S'表示任务处于挂起态,或者任务未超时时的屏蔽态。
- 'D'表示任务已被删除。
Priority:
vTaskList()函数被调用时,任务的优先级。
Stack:
依据“栈水位线”,显示任务开始到现在剩下过的最小的内存。[[栈水位线]]
假设Task1分配了2048的栈深,Stack显示180,则该任务历史最少还有180的栈深未使用。
Num:
每个任务都拥有一个唯一的数字标记,如果多个任务的名字相同,这个数字可以用来分辨不同的任务。
参数:
pcWriteBuffer:用于存储任务信息的表格,应确保分配足够的内存空间。
注意事项:
vTaskLisit()被调用时会关闭中断,注意不能在一些对时间敏感任务中使用。configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS必须同时被置1,此函数才可用。
可以在
idf.py menuconfig中进行设置:Component config -> FreeRTOS -> Kernel -> configUSE_TRACE_FACILITY & configUSE_STATS_FORMATTING_FUNCTIONS
示例代码
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
void task1(void *pvPara)
{
while (true) {
printf("Task1 is running!\n");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void task2(void *pvPara)
{
while (true) {
printf("Task2 is running!\n");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void app_main(void)
{
static char pcWriteBuffer[512];
xTaskCreate(task1, "Task1", 2048, NULL, 1, NULL);
xTaskCreate(task2, "Task2", 2048, NULL, 1, NULL);
vTaskList(pcWriteBuffer); // 读取任务信息到Buffer
printf("%s\n", pcWriteBuffer); // 打印
}
示例输出

可以看到任务列表已经被打印出来,横向排列,分别是Name, State, Priority, Stack, Num,其中:
main任务处于X运行态,优先级1,栈水位线2412,唯一数字标识2。
可以看到自己创建的任务Task1和Task2:
Task1任务处于B阻塞态,优先级1,栈水位线1352,唯一数字标识5。
[[栈水位线]]