STM32 RTX使用故障PSP 0x00000020



我有一个项目,它有一个STM32F446,带有RTX,3个线程(我声明的main+2),当然还有一个空闲线程。主线程在启动两个线程后进入等待状态,所以我只有两个线程在运行。RTX已禁用循环。该应用程序通过SPI与蓝牙模块进行通信。

我的问题是,有时,在SPI传输期间(由一个线程启动,在另一个线程中完成),MCU会崩溃到UsageFaultHandler,其中一个线程(并不总是相同)会溢出。现在我已经读到了如何调试硬故障和什么不调试,但问题是所有的方法都依赖于MSP/PSP地址,对我来说PSP是0x00000020。有人遇到过类似的事情吗?有什么可能出错的想法吗?

LE:从那以后,我了解到该代码适用于FreeRTOS,而不是RTX。该代码使用关键部分。我曾尝试在RTX的关键部分使用与FreeRTOS(BASEPRI)相同的实现,但我经常会遇到UsageFault。我知道RTX在代码中广泛使用SVC。

关键部分是否应该以不同的方式实施?您知道FreeRTOS和RTX之间还有其他可能导致问题的差异吗?

后期编辑(已解决):原来问题与分配给SysTick的优先级有关。它最初被设置为最低优先级,但有一段代码,某个地方将SysTick设置为非常高的优先级。

谢谢!

当函数返回其堆栈指针时,如果堆栈已损坏,则可能会恢复无效值,因此SP中的值不是特别有用或信息丰富。

当然,包括程序计数器在内的所有其他寄存器也可能被损坏。UsageFault发生在未定义的指令、未对齐的内存访问上——如果返回是用损坏的堆栈执行的,这两种情况都可能发生,因为返回可能会出现在任何地方。您甚至可能会发现,更改代码会导致不同的故障类型。如果看不到代码,就不可能确定原因,但可能的问题是本地数据缓冲区溢出或只是分配的堆栈空间不足。

诊断此故障的最简单方法可能是使用具有跟踪功能的调试硬件,尽管这些硬件比更简单的JTAG或SWI调试器更昂贵。

最新更新