摘要
每个任务都有自己的堆栈,堆栈的总大小在创建任务的时候就确定了,此函数用于检查任务从创建好到现在的历史剩余最小值,这个值越小说明任务堆栈溢出的可能性就越大!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