我正在尝试使用 vTaskList 或 vTaskLists 函数在 RP2040 Raspberry Pico 上调试 FreeRTOS 应用程序调度,但无法在串行线路(minicom)上获得任何输出。
这是我的
main()
源代码:
char pcWriteBuffer[0xFFFF];
stdio_init_all();
if (cyw43_arch_init()) {
return -1;
}
xTaskCreate(external_led_task, "External_LED_Task", 256, NULL, 3, NULL);
xTaskCreate(onboard_led_task, "Onboard_LED_Task", 256, NULL, 3, NULL);
vTaskStartScheduler();
vTaskList(pcWriteBuffer);
printf("%s\n", pcWriteBuffer);
while(1){};
我通过 USB 的串行输出已在
CMakeLists.txt
上启用,并且我已经在相同代码上测试了其他 printfs,在 minicom 上正确显示。
pico_enable_stdio_usb(${ProjectName} 1)
pico_enable_stdio_uart(${ProjectName} 0)
我已经定义了使用这些函数所需的两个
FreeRTOSConfig.h
宏:
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
我也尝试过这样使用
vTaskListTasks
:
char pcWriteBuffer[1024];
vTaskListTasks(pcWriteBuffer, 1024);
printf("%s\n", pcWriteBuffer);
我尝试仅为
vTaskList
或 vTaskListTasks
创建任务,我不知道为什么,但当我尝试此操作时,程序甚至不运行,尝试对所有任务使用相同的任务优先级。
缓冲区
pcWriteBuffer
是堆栈上的一个64KB对象,位于只有256KB RAM的部分。除了远远大于任务列表的合理需要(文档建议每个任务 40 字节)之外,它还大于您可能的主堆栈大小(通常为几 KB)。使缓冲区变小并声明它static
。 vTaskList()
会阻塞调度程序,因此使用 static
不会出现重入问题。
但这不是您问题的原因(尽管这是一个问题)。主要问题在这里:
vTaskStartScheduler();
vTaskList(pcWriteBuffer);
printf("%s\n", pcWriteBuffer);
vTaskList()
永远不会被调用,因为 vTaskStartScheduler()
永远不会返回,如文档所述:
vTaskStartScheduler() 仅在没有足够的 RTOS 堆可用时才会返回 创建空闲或计时器守护程序任务。
只有从任务上下文中调用
vTaskList
才有意义(或者在创建任务之后、调用 vTaskStartScheduler()
之前,也许,尽管这没什么用处)