系统的任务状态

系统的任务状态

官方文档参考 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函数

官方文档参考

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),通过观察任务状态可以帮助我们做调试,了解系统的运行状态。
  1. Name:

任务创建时给予的名字。

  1. State:
  1. 'X'表示任务处于运行状态 。
  2. 'B'表示任务处于阻塞态。
  3. 'R'表示任务处于就绪态。
  4. 'S'表示任务处于挂起态,或者任务未超时时的屏蔽态。
  5. 'D'表示任务已被删除。
  1. Priority:

vTaskList()函数被调用时,任务的优先级。

  1. Stack:

依据“栈水位线”,显示任务开始到现在剩下过的最小的内存。[[栈水位线]]
假设Task1分配了2048的栈深,Stack显示180,则该任务历史最少还有180的栈深未使用。

  1. Num:

每个任务都拥有一个唯一的数字标记,如果多个任务的名字相同,这个数字可以用来分辨不同的任务。
参数:

  • pcWriteBuffer:用于存储任务信息的表格,应确保分配足够的内存空间。

注意事项:

  • vTaskLisit()被调用时会关闭中断,注意不能在一些对时间敏感任务中使用。
  • configUSE_TRACE_FACILITYconfigUSE_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); // 打印
}

示例输出

7. 系统的任务状态-20240613114327776.webp

可以看到任务列表已经被打印出来,横向排列,分别是Name, State, Priority, Stack, Num,其中:

main任务处于X运行态,优先级1,栈水位线2412,唯一数字标识2

可以看到自己创建的任务Task1Task2

Task1任务处于B阻塞态,优先级1,栈水位线1352,唯一数字标识5

[[栈水位线]]

Comment