官方文档参考
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));
}
示例输出:
从输出结果可以得到,栈水位线是1352
,因为我们设置的栈深是2048
,因此次函数最少需要:
2048 - 1352 = 696
,即此函数最少需要696
个栈深的内存空间。
因为我们使用的是32
位的ESP32
,在32
位CPU
中,一个栈深占用4
个字节的内存,所以这个函数最少使用:696 * 4 = 2784
个字节的内存。[[堆栈宽度与深度]]