3

我目前遇到问题,我认为在 STM32F407 目标上运行 FreeRTOS 时某些配置错误的堆栈损坏。

用 gcc 查看了 STM32F4 上的 FreeRTOS 堆栈损坏,但没有得到任何帮助。

应用程序运行两个任务并依赖于一个 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,是撰写本文时的最新版本。

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

4

2 回答 2

2

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

于 2013-06-03T14:39:48.800 回答
1

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

void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)

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

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

于 2017-05-26T15:25:38.893 回答