为什么 vTaskList 和 vTaskListTasks 无法在 FreeRTOS 11.0.1 上运行?

问题描述 投票:0回答:1

我正在尝试使用 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
创建任务,我不知道为什么,但当我尝试此操作时,程序甚至不运行,尝试对所有任务使用相同的任务优先级。

c cmake embedded freertos raspberry-pi-pico
1个回答
0
投票

缓冲区

pcWriteBuffer
是堆栈上的一个64KB对象,位于只有256KB RAM的部分。除了远远大于任务列表的合理需要(文档建议每个任务 40 字节)之外,它还大于您可能的主堆栈大小(通常为几 KB)。使缓冲区变小并声明它
static
vTaskList()
会阻塞调度程序,因此使用
static
不会出现重入问题。

但这不是您问题的原因(尽管这是一个问题)。主要问题在这里:

    vTaskStartScheduler();

    vTaskList(pcWriteBuffer);
    printf("%s\n", pcWriteBuffer);

vTaskList()
永远不会被调用,因为
vTaskStartScheduler()
永远不会返回,如文档所述:

vTaskStartScheduler() 仅在没有足够的 RTOS 堆可用时才会返回 创建空闲或计时器守护程序任务。

只有从任务上下文中调用

vTaskList
才有意义(或者在创建任务之后、调用
vTaskStartScheduler()
之前,也许,尽管这没什么用处)

© www.soinside.com 2019 - 2024. All rights reserved.