代码之家  ›  专栏  ›  技术社区  ›  Mehmet Aslan

freertos堆栈不会溢出

  •  0
  • Mehmet Aslan  · 技术社区  · 6 月前

    你好,互联网上的好人

    我在学习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
    
    1 回复  |  直到 6 月前
        1
  •  0
  •   tl-photography.at    5 月前

    函数调用 (int)uxTaskGetStackHighWaterMark(NULL) ( GitHub link )不会对操作系统内部进行回调。因此,没有对其进行检查,任务也永远不会从循环中返回。

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

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