freertos堆栈溢出管理

发布时间:2024年01月04日

堆栈溢出检测 - 方法 1
在 RTOS 内核将任务从运行状态换出后,堆栈可能会达到其最大(最深)值,因为此时堆栈将包含任务上下文。此时,RTOS 内核可以检查处理器堆栈指针是否保持在有效堆栈空间内。如果堆栈指针包含超出有效堆栈范围的值,则调用堆栈溢出挂钩函数。
此方法很快,但不能保证捕获所有堆栈溢出。将 configCHECK_FOR_STACK_OVERFLOW 设置为 1 以使用此方法。

堆栈溢出检测 - 方法 2
当一个任务第一次被创建时,它的栈被一个已知的值填充。将任务从运行状态换出时,RTOS 内核可以检查有效堆栈范围内的最后 16 个字节,以确保这些已知值没有被任务或中断活动覆盖。如果这 16 个字节中的任何一个不保持其初始值,则调用堆栈溢出挂钩函数。
这种方法比方法一效率低,但仍然相当快。它很可能会捕获堆栈溢出,但仍不能保证捕获所有溢出。

将 configCHECK_FOR_STACK_OVERFLOW 设置为 2 以使用此方法。

void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName )
{
?? ?static uint32_t tmp = 0;
? ? tmp++;
}?

栈计算

每个任务都独立维护自己的栈空间, 任务栈空间总量在任务创建时进行设定。uxTaskGetStackHighWaterMark()主要用来查询指定任务的运行历史中, 其栈空间还差多少就要溢出。这个值被称为栈空间的High Water Mark
函数原型:

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )

想要使用它,需要将对应的宏定义打开:INCLUDE_uxTaskGetStackHighWaterMark

void Task1(void const * argument)
{
?? ?for(;;)
?? ?{
?? ??? ?osDelay(500);
?? ??? ?printf("\r\nTask剩余栈%d\r\n",uxTaskGetStackHighWaterMark(NULL));?? ?//uxTaskGetStackHighWaterMark以word为单位
?? ?}
}
?


?

文章来源:https://blog.csdn.net/qq_41694204/article/details/135377278
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。