如何理解uxtaskgetstackhighlwatermark()的return值

How to understand the return value of uxtaskgetstackhighlwatermark()

根据官方文档 : “uxTaskGetStackHighWaterMark() 用于查询任务离溢出分配给它的堆栈 space 有多近。

我正在使用 rtl8720,一个 32 位芯片 运行 FreeRTOS_v10.2.0。 我写了一个测试程序如下,main()函数会调用TestTaskEntry():

static void TestStack()
{
    char buff[500] = {0};

    #if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
    printf("\n\r[2] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
    #endif

    return;
}

static void TestTask()
{
    #if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
    printf("\n\r[1] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
    #endif

    TestStack();

    #if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
    printf("\n\r[3] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
    #endif

    vTaskDelete(NULL);
}

void TestTaskEntry(void)
{
    if(xTaskCreate(TestTask, ((const char*)"test task"), 500, NULL,
        tskIDLE_PRIORITY + 3 + PRIORITIE_OFFSET, NULL) != pdPASS) {
        printf("\n\rcreate stack failed\n\r");
    }
}

程序打印如下:

[1] Min available stack size 485 * 4 bytes

[2] Min available stack size 424 * 4 bytes

[3] Min available stack size 424 * 4 bytes

我觉得[1]应该更接近TestTask的任务深度(500 * 4字节)。但是 [2] 和 [3] 应该比 [1] 小 500 字节,因为有一个 500 字节大小的本地数组。 我应该如何理解我的程序的实际执行结果?为什么 StackHighWater 不是 TestTask 历史上最小的剩余堆栈?

我认为您的 buff 变量已被编译器优化,因为它从未被使用过,因此不需要任何堆栈。您可以尝试通过编写 volatile char buff[500] = {0}; 来阻止优化。 出于测试目的,我还会在调用 xTaskCreate.

时增加堆栈大小

常见问题解答中还有一个关于堆栈使用估计的重要章节:https://www.freertos.org/FAQMem.html#StackSize