我目前在STM32F407目标上运行FreeRTOS时遇到的问题是我认为堆栈损坏了一些配置错误。
我看了FreeRTOS stack corruption on STM32F4 with gcc但没有得到任何帮助。
应用程序运行两个任务并依赖于一个CAN中断。工作流程如下:
问题在于,由于最终用户的便利性和可移植性,我已经将app_task对xQueueReceive的调用分为两步。 app_task总函数链是它调用network_receive(..) - > os_queue_receive(..) - > xQueueReceive(..)。这很好用,但是当它从xQueueReceive(..)返回时,它只能在返回到看似随机的内存位置之前返回到os_queue_receive(..)并且我遇到了一个硬错误。
堆栈大小应该足够,两者都设置为2048,所有大型数据结构都作为指针传递。
我在两个STM32F407上运行我的代码。 FreeRTOS版本为7.4.2,是撰写本文时的最新版本。
我真的希望有人可以帮助我!
答案 0 :(得分:2)
答案 1 :(得分:1)
我知道这个问题相当陈旧,但也许这可以帮助其他人面对类似的问题。在FreeRTOS中,您可以使用
void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
用于检测堆栈溢出并获取有关违规任务的相关信息。由于溢出,数据可能会损坏,但您可以至少解决发生溢出的事实(重置系统,设置错误标志/ LED等)
对于这个具体问题,我很想看到线程初始化代码以及中断例程。如果问题实际上是溢出,我认为调整这些参数直到问题消失是相当简单的。你提到每个线程应该足够2048个字节 - 如果确实如此,我怀疑问题是溢出。此时,您更有可能取消引用指向过时内存地址的悬空指针。