C 如何在FreeRTOS上模拟堆栈溢出

C 如何在FreeRTOS上模拟堆栈溢出,c,embedded,stack-overflow,freertos,C,Embedded,Stack Overflow,Freertos,我将CubeMX STM32配置为使用FreeRTOS堆栈溢出监控。 现在我想测试它是否真的有效。 我尝试了一些简单的方法,比如在一个线程中执行下面的函数 `// C program to demonstrate stack overflow // by creating a non-terminating recursive // function. void fun(int x) { if (x == 1) return; x = 6;

我将CubeMX STM32配置为使用FreeRTOS堆栈溢出监控。 现在我想测试它是否真的有效。 我尝试了一些简单的方法,比如在一个线程中执行下面的函数

`// C program to demonstrate stack overflow 
// by creating a non-terminating recursive 
// function. 

void fun(int x) 
{ 
    if (x == 1) 
       return; 
    x = 6; 
    fun(x); 
} 

   int x = 5; 
   fun(x); 
但我有硬毛病


你知道在FreeRTOS上模拟堆栈溢出的方法吗?

看起来我找到了解决方案。 您只需将一个线程的堆栈大小更改为非常低,程序就可以运行了
VAApplicationsTackOverflowHook

当正在运行的任务从正在运行的状态切换出去时,会发生堆栈监视

您的程序可能会在换出运行状态之前达到某些硬件内存限制(并生成硬故障)。因此,堆栈监视器永远不会运行


因此,在函数内部进行操作系统调用,以使任务切换出运行状态。类似延迟/睡眠或类似的测试。

这是一个非常不确定的测试。正如@4386427所指出的,RTO只能在系统调用或重新调度时检查堆栈。您的测试可能依赖于在线程创建时被吹扫的堆栈,而不是测试函数。更好的方法是在fun()的开始处插入vTaskDelay(1)调用,以强制调度程序在每次调用中运行。