前言
在使用esp32s3 开发的时候,项目使用了freeRTOS
如果我们创建了很多任务,由于系统给任务分配了堆栈,我们如果想要实时监控堆栈的使用情况
就需要通过内核提供的任务监控函数定时打印,各个任务的堆栈详情。
遇到问题
通过下面的代码,
#include "freertos/FreeRTOSConfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"
#include "freertos/queue.h"
void app_main()
{
init_hardware();
while (1)
{
vTaskDelay(pdMS_TO_TICKS(199));
if(++stack_cnt>36)
{
stack_cnt=0;
//istack = uxTaskGetStackHighWaterMark(pxexe_task);
//printf("pxexe_task istack = %d\n", istack);
//istack = uxTaskGetStackHighWaterMark(pxmytime_deal_task);
//printf("pxexe_task istack = %d\n", istack);
memset(CPU_RunInfo,0,400);
vTaskList((char*)CPU_RunInfo);
printf("----------------------------------------------------\r\n");
printf("task_name status priority less_stack T_id Core\r\n");
printf("%s", CPU_RunInfo);
}
}
}
排查错误
Bootloader binary size 0x5800 bytes. 0x2800 bytes (31%) free.
[5/7] Linking CXX executable SAMPLE_PROJECT.elf
FAILED: SAMPLE_PROJECT.elf
cmd.exe /C "cd . && D:\espressif\tools\tools\xtensa-esp-elf\esp-13.2.0_20230928\xtensa-esp-elf\bin\xtensa-esp32s3-elf-g++.exe -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -Wl,--cref -Wl,--defsym=IDF_TARGET_ESP32S3=0 -Wl,--Map=D:/esp32/yuhu_a539/fixDriver/sample_project/build/SAMPLE_PROJECT.map -Wl,--no-warn-rwx-segments -fno-rtti -fno-lto -Wl,--gc-sections -Wl,--warn-common -T esp32s3.peripherals.ld -T esp32s3.rom.ld -T esp32s3.rom.api.ld -T esp32s3.rom.libgcc.ld -T esp32s3.rom.newlib.ld -T esp32s3.rom.version.ld -T memory.ld -T sections.ld @CMakeFiles\SAMPLE_PROJECT.elf.rsp -o SAMPLE_PROJECT.elf && cd ."
D:/espressif/tools/tools/xtensa-esp-elf/esp-13.2.0_20230928/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/main/libmain.a(main.c.obj):(.literal.app_main+0x34): undefined reference to `vTaskList'
D:/espressif/tools/tools/xtensa-esp-elf/esp-13.2.0_20230928/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/13.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/main/libmain.a(main.c.obj): in function `app_main':
D:/esp32/yuhu_a539/fixDriver/sample_project/main/main.c:134:(.text.app_main+0xb7): undefined reference to `vTaskList'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
从报错信息来看,就是vTaskList未定义
然后我直接ctrl 单击函数进入,发现这个函数虽然内核有些,但是被宏定义屏蔽了
所以解决方法就是,手动打开这个宏定义