【问题标题】:FreeRTOS - Stack corruption on STM32F4FreeRTOS - STM32F4 上的堆栈损坏
【发布时间】:2013-05-02 20:47:56
【问题描述】:

我目前在 STM32F407 目标上运行 FreeRTOS 时遇到了一些问题,我认为这是由于某些配置错误导致堆栈损坏。

我查看了FreeRTOS stack corruption on STM32F4 with gcc,但没有得到任何帮助。

应用程序运行两个任务并依赖一个 CAN 中断。工作流程如下:

  1. 两个任务 network_task 和 app_task 与两个队列 raw_msg_queue 和 app_msg_queue 一起创建。 CAN 中断也已设置。
  2. network_task 具有最高优先级,并开始无限期地等待 raw_msg_queue。
  3. app_task 是下一个并开始在 app_msg_queue 上等待。
  4. 然后由于外部事件触发 CAN 中断,将 CAN 消息添加到 raw_msg_queue。
  5. network_task 唤醒,处理消息,将处理后的消息添加到 app_msg_queue,然后继续等待 raw_msg_queue。
  6. app_task 唤醒,我遇到了一个硬故障。

问题在于,由于最终用户的便利性和可移植性,我已经分两步包装了 app_task 对 xQueueReceive 的调用。 app_task总的函数链是它调用network_receive(..) -> os_queue_receive(..) -> xQueueReceive(..)。这很好用,但是当它从 xQueueReceive(..) 返回时,它只能在返回到看似随机的内存位置之前返回到 os_queue_receive(..) 并且我遇到了硬故障。

堆栈大小应该足够,并且两者都设置为 2048,所有大型数据结构都作为指针传递。

我在两个 STM32F407 上运行我的代码。 FreeRTOS 的版本为 7.4.2,是撰写本文时的最新版本。

我真的希望有人可以在这里帮助我!

【问题讨论】:

    标签: c stm32 freertos stm32f4discovery


    【解决方案1】:

    我知道这个问题已经很老了,但也许这可以帮助其他人解决类似的问题。在 FreeRTOS 中,您可以利用

    void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)

    检测堆栈溢出并获取有关违规任务的相关信息的函数。数据可能由于溢出而损坏,但您至少可以解决发生溢出的事实(重置系统、设置错误标志/LED 等)

    对于这个特定的问题,我很想看看线程初始化代码以及中断例程。如果问题实际上是溢出,我认为调整这些参数直到问题消失是相当简单的。您提到每个线程 2048 字节应该足够了 - 如果确实如此,我怀疑问题是溢出。此时,您更有可能取消引用指向陈旧内存地址的悬空指针。

    【讨论】:

      【解决方案2】:

      首先,您可以查看here 并尝试获取有关硬故障的更多信息。 您可能还想检查您的中断优先级设置,因为棘手的 ARM Cortex-M 中断优先级机制会在 FreeRTOS 中引起一些问题。参考here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        相关资源
        最近更新 更多