freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

it2023-08-31  121

摘要

每个任务都有自己的堆栈,堆栈的总大小在创建任务的时候就确定了,此函数用于检查任务从创建好到现在的历史剩余最小值,这个值越小说明任务堆栈溢出的可能性就越大!FreeRTOS 把这个历史剩余最小值叫做“高水位线”。此函数相对来说会多耗费一点时间,所以在代码调试阶段可以使用,产品发布的时候最好不要使用。

使用说明

要使用此函数的话宏INCLUDE_uxTaskGetStackHighWaterMark 必须为 1, 此函数原型如下:UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )

参数:

xTask: 要查询的任务的任务句柄,当这个参数为 NULL 的话说明查询自身任务(即调用函数 uxTaskGetStackHighWaterMark()的任务)的“高水位线”。

返回值

任务堆栈的“高水位线”值,也就是堆栈的历史剩余最小值。

例子

首先将FreeRtos.h中的INCLUDE_uxTaskGetStackHighWaterMark 置 1 官方介绍

#define START_TASK_PRIO 1 #define START_STK_SIZE 128 void start_task(void * pvParameters); //任务函数 TaskHandle_t StartTask_Handler; //任务句柄 #define SYSLED_TASK_PRIO 2 //led灯任务优先级 #define SYSLED_STK_SIZE 64 //任务堆栈大小 TaskHandle_t SYSLEDTask_Handler; //任务句柄 void sysled_task(void *pvParameters); //led灯任务函数 //创建开始任务 xTaskCreate ( (TaskFunction_t ) start_task, (const char * ) "start_task", (uint16_t ) START_STK_SIZE, (void * ) NULL, (UBaseType_t ) START_TASK_PRIO, (TaskHandle_t * ) &StartTask_Handler ); vTaskStartScheduler(); //开始任务调度 while(1); //开始任务池 void start_task(void *pvParameters) { taskENTER_CRITICAL(); //进入临界区 xTaskCreate((TaskFunction_t)sysled_task, (const char *)"sysled_task", (uint16_t)SYSLED_STK_SIZE, (void *)NULL, (UBaseType_t)SYSLED_TASK_PRIO, (TaskHandle_t *)&SYSLEDTask_Handler); //系统指示灯任务 vTaskDelete(StartTask_Handler); //删除开始任务 taskEXIT_CRITICAL(); //退出临界区 } UBaseType_t more; 系统指示灯 void sysled_task(void *pvParameters) { while(1) { more = uxTaskGetStackHighWaterMark(NULL); vTaskDelay(LED_vTASKdelay); } }

DEBUG调试如下:

总结

在创建任务时 分配的堆栈大小是64K 目前剩余0x26换算成十进制是38K(剩余量) 所以该任务占用了64-38=26K

最新回复(0)