freertos堆栈溢出管理

堆栈溢出检测 - 方法 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为单位
    }
}
 


 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值