《FreeRTOS的检测栈溢出一种方法》(uxTaskGetStackHighWaterMark())

本文介绍了FreeRTOS系统中栈检测的重要性及其应用场景,并提供了uxTaskGetStackHighWaterMark()函数的具体用法,通过实例展示了如何监测任务栈空间使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


为什么要栈检测

首先看我们创建每个任务使用者都是用自己的经验,这个任务大概占多大根据经验然后我们分配给它空间,但是任务栈空间的实际使用量会随着任务执行和中断处理过程上下浮动,所以FreeRTOS提供了一种检测栈剩余的接口。

注意事项

使用这个API首先要在FreeRTOS.h中打开uxTaskGetStackHighWaterMark

#ifndef INCLUDE_uxTaskGetStackHighWaterMark
    #define INCLUDE_uxTaskGetStackHighWaterMark 1
#endif
检测栈剩余函数的介绍

uxTaskGetStackHighWaterMark()

unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );

参数名

xTask  被查询任务的句柄,如果传入 NULL 句柄,则是自己任务的栈剩余

返回值

返回从任务启动栈空间具有的最小剩余量这个值越是接近 0,说明这个任务快溢出了。

下面是官网的介绍

Parameters:
xTask     The handle of the task being queried. A task may query its own high water mark by passing NULL as the xTask parameter.
Returns:
The value returned is the high water mark in words (for example, on a 32 bit machine a return value of 1 would indicate that 4 bytes of stack were unused). If the return value is zero then the task has likely overflowed its stack. If the return value is close to zero then the task has come close to overflowing its stack.
使用的事例

可以用单独的一个任务去检测需要检测的任务 Main函数

int main()
{
    if(xTaskCreate(stack_overflow_cat, "stack_overflow_cat", 512, NULL,1, NULL) != pdPASS){
        printf("[%s] stack_overflow error\n",__func__);
    }
    if(xTaskCreate(test_1, "test_1", 512, NULL,1,&pv_handle) != pdPASS){
        printf("[%s] test_1 error\n",__func__);
    }
    vTaskStartScheduler();
    for(;;);
}

检测的函数和demo函数

static xTaskHandle pv_handle = NULL;
void test_1(void *param)
{
    printf("test_1 stack:%d\n",(int)uxTaskGetStackHighWaterMark(NULL));
    for(;;)
    {
        /*各种操作*/
        vTaskDelay(10000);
    }
    vTaskDelete( NULL );
}
void stack_overflow_cat(void *param)
{

    for(;;)
    {
        printf("stack:%d\n",(int)uxTaskGetStackHighWaterMark(pv_handle));
        vTaskDelay(500);
    }
    vTaskDelete( NULL );
}

打印

statack:501   这个是test1刚进入的时候栈剩余
stack:347
stack:347
stack:347
stack:347
stack:347
stack:347
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小白鱼儿_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值