FreeRTOS - STM32F4上的堆栈损坏

时间:2013-05-08 14:49:25

标签: c stm32 freertos stm32f4discovery

我目前在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中断因外部事件而触发,向raw_msg_queue添加CAN消息。
  5. network_task唤醒,处理消息,将处理后的消息添加到app_msg_queue,然后继续等待raw_msg_queue。
  6. app_task醒来,我遇到了一个严重的错误。
  7. 问题在于,由于最终用户的便利性和可移植性,我已经将app_task对xQueueReceive的调用分为两步。 app_task总函数链是它调用network_receive(..) - > os_queue_receive(..) - > xQueueReceive(..)。这很好用,但是当它从xQueueReceive(..)返回时,它只能在返回到看似随机的内存位置之前返回到os_queue_receive(..)并且我遇到了一个硬错误。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我知道这个问题相当陈旧,但也许这可以帮助其他人面对类似的问题。在FreeRTOS中,您可以使用

void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)

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

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