文章目录
- 显示任务详细信息 vTaskList
- 代码示例
显示任务详细信息 vTaskList
通过
vTaskList
来协助分析操作系统当前 task 状态,以帮助优化内存,帮助定位栈溢出问题。
void vTaskList( char *pcWriteBuffer );
parameter | description |
---|---|
pcWriteBuffer | 保存任务状态信息表的存储区,须足够大 |
return | 空 |
pcWriteBuffe
表中信息
- Name:创建任务的时候给任务分配的名字
- State:任务的状态信息,X:运行态,B:阻塞态,R:就绪态,S:挂起态,D:删除态
- Priority:任务优先级
- Stack:任务堆栈的“高水位线”,就是堆栈历史最小剩余值
- Num:任务编号,这个编号是唯一的;当多个任务使用同一个任务名的时候;可以通过编号来区分
注意事项:
在使用
vTaskList
前需要在FreeRTOSConfig.h
文件中打开configUSE_TRACE_FACILITY
和configUSE_TRACE_FACILITY
如使用ESP32、ESP8266,需使能
Enable FreeRTOS trace facility
和Enable FreeRTOS stats formatting functions
make menuconfig
->Component config
->FreeRTOS
->Enable FreeRTOS trace facility
make menuconfig
->Component config
->FreeRTOS
->Enable FreeRTOS trace facility
->Enable FreeRTOS stats formatting functions
通过上面配置,等同于使能 FreeRTOSConfig.h 中如下两个宏:
configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS
代码示例
#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
void task1(void *pvParam)
{
while (1)
{
printf("task1!\n");
vTaskDelay(3000 / portTICK_PERIOD_MS);
vTaskDelete(NULL);
}
}
void task2(void *pvParam)
{
while (1)
{
printf("task2!\n");
vTaskDelay(3000 / portTICK_PERIOD_MS);
vTaskDelete(NULL);
}
}
void app_main(void)
{
xTaskCreate(task1, "task1", 4096, NULL, 1, NULL);
xTaskCreate(task2, "task2", 4096, NULL, 1, NULL);
static char pcWriteBuffer[512] = {0};
vTaskList(pcWriteBuffer);
printf("-----------------------------------------");
printf("Name State Priority Stack Num\n");
printf("%s\n",pcWriteBuffer);
}