【问题标题】:How to simulate stack overflow on FreeRTOS如何在 FreeRTOS 上模拟堆栈溢出
【发布时间】:2020-05-17 00:39:09
【问题描述】:

我将 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); 

但我得到了 HardFault。

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

【问题讨论】:

    标签: c embedded stack-overflow freertos


    【解决方案1】:

    看来我找到了解决方案。 您所需要做的就是将一个线程的堆栈大小更改为非常低,然后程序转到 vApplicationStackOverflowHook

    【讨论】:

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

    当一个正在运行的任务被换出运行状态时,就会发生堆栈监控。

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

    因此,在函数内部进行操作系统调用,使任务脱离运行状态。像延迟/睡眠或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2013-05-02
      相关资源
      最近更新 更多