freertos 堆栈不会溢出

问题描述 投票:0回答:1

各位互联网好心人大家好

我正在研究 FreeRTOS,我预计 myTaskA 会溢出堆栈,但事实并非如此。怎么会呢?

FreeRTOSConfig.h

#define configCHECK_FOR_STACK_OVERFLOW           2
// demo 2 : allocating huge array in stack to ovf
static void app_myTaskA( void * pvParameters ) {
    uint32_t myHugeArray[APP_DEFAULT_STACK_SIZE+1];
    printf("remStack: %d\n", (int)uxTaskGetStackHighWaterMark(NULL));
    uint32_t anotherU32 = 0;
    printf("remStack: %d\n", (int)uxTaskGetStackHighWaterMark(NULL));

    for(size_t i = 0; i < sizeof(myHugeArray); ++i) {
        // implementing sth so compiler does not optimize out
        myHugeArray[i] = i;
        myHugeArray[i]++;
        myHugeArray[i]--;
        anotherU32++;
    }

    while(1) { // to see if task survives and prints remaining stack constantly
        int remStack = (int)uxTaskGetStackHighWaterMark(NULL);
        if (remStack) {
            printf("remStack: %d\n", remStack);
        } else {
            printf("no remStack\n");
        }
    }
}

端子输出

QEMU_started
remStack: 1014
remStack: 1014
no remStack
no remStack
no remStack
stack overflow qemu freertos
1个回答
0
投票

函数调用

(int)uxTaskGetStackHighWaterMark(NULL)
GitHub 链接)不会回调操作系统内部。因此不会执行任何检查,并且任务永远不会从任务中返回。

如果您从任务返回或调用另一个操作系统函数,这将向操作系统回调(可能是资源处理调用),然后操作系统将调用操作系统检查逻辑。

当任务被另一个任务抢占时也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.