官方文档参考
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
。
[[栈水位线]]