Task 堆栈设置和调试

Task 堆栈设置和调试

官方文档参考 79 2.5 uxTaskGetStackHighWaterMark() [[FreeRTOS_Reference_Manual_V10.0.0.pdf#page=79&selection=0,2,4,29|FreeRTOS_Reference_Manual_V10.0.0, page

官方文档参考

79 2.5 uxTaskGetStackHighWaterMark()

[[FreeRTOS_Reference_Manual_V10.0.0.pdf#page=79&selection=0,2,4,29|FreeRTOS_Reference_Manual_V10.0.0, page 79]]


获取栈水位线( HighWaterMark )

#include "FreeRTOS.h"
#include "task.h"

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );

函数说明:

  • 每个函数都有自己的堆栈,总堆栈大小在任务创建时已经被设置好。此函数作用是获取任务函数还有多少剩余堆栈空间。
    参数:
  • xTask: 要获取栈水位线的目标函数的句柄。

示例代码:

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

void task1(void *pvPara)
{
    while (true) {
        printf("Task1 is running!\n");

        vTaskDelay(500 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    TaskHandle_t handle_task1;
    xTaskCreate(task1, "Task1", 2048, NULL, 1, &handle_task1);

    printf("high water mark: %d\n", uxTaskGetStackHighWaterMark(handle_task1));
}

示例输出:

8. Task 堆栈设置和调试-20240613135600038.webp

从输出结果可以得到,栈水位线是1352,因为我们设置的栈深是2048,因此次函数最少需要:
2048 - 1352 = 696,即此函数最少需要696个栈深的内存空间。
因为我们使用的是32位的ESP32,在32CPU中,一个栈深占用4个字节的内存,所以这个函数最少使用:696 * 4 = 2784个字节的内存。[[堆栈宽度与深度]]

Comment