2013-05-08 115 views
3

我目前有问题,我认为是在STM32F407目标上运行FreeRTOS时配置错误的堆栈损坏。FreeRTOS - STM32F4上的堆栈损坏

我看过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,是本文撰写时的最新版本。

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

回答

1

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

1

我知道这个问题相当老,但也许这可能会帮助其他人面临类似的问题。在FreeRTOS操作系统,你可以利用

void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)

功能来检测堆栈溢出,并抓住有关问题的任务培训相关信息。数据可能因溢出而损坏,但至少可以解决发生溢出(重置系统,设置错误标志/ LED等)的事实

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