各位互联网好心人大家好
我正在研究 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
函数调用
(int)uxTaskGetStackHighWaterMark(NULL)
(GitHub 链接)不会回调操作系统内部。因此不会执行任何检查,并且任务永远不会从任务中返回。
如果您从任务返回或调用另一个操作系统函数,这将向操作系统回调(可能是资源处理调用),然后操作系统将调用操作系统检查逻辑。
当任务被另一个任务抢占时也是如此。