我目前遇到问题,我认为在 STM32F407 目标上运行 FreeRTOS 时某些配置错误的堆栈损坏。
我用 gcc 查看了 STM32F4 上的 FreeRTOS 堆栈损坏,但没有得到任何帮助。
应用程序运行两个任务并依赖于一个 CAN 中断。工作流程如下:
- 两个任务 network_task 和 app_task 与两个队列 raw_msg_queue 和 app_msg_queue 一起创建。CAN 中断也已设置。
- network_task 具有最高优先级,并开始无限期地等待 raw_msg_queue。
- app_task 是下一个并开始在 app_msg_queue 上等待。
- 然后 CAN 中断因外部事件而触发,将 CAN 消息添加到 raw_msg_queue。
- network_task 唤醒,处理消息,将处理后的消息添加到 app_msg_queue,然后继续等待 raw_msg_queue。
- app_task 唤醒,我遇到了一个硬故障。
问题是,由于最终用户的便利性和可移植性,我已经分两步包装了 app_task 对 xQueueReceive 的调用。app_task总的函数链是它调用network_receive(..) -> os_queue_receive(..) -> xQueueReceive(..)。这很好用,但是当它从 xQueueReceive(..) 返回时,它只能在返回到看似随机的内存位置之前返回到 os_queue_receive(..) 并且我得到一个硬故障。
堆栈大小应该足够,并且两者都设置为 2048,所有大型数据结构都作为指针传递。
我在两个 STM32F407 上运行我的代码。FreeRTOS 的版本为 7.4.2,是撰写本文时的最新版本。
我真的希望有人可以在这里帮助我!