STM32 RTX使用故障PSP 0x00000020

时间:2017-10-22 09:24:34

标签: arm stm32 rtos cortex-m rtx

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

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

LE:我已经了解到代码适用于FreeRTOS,而不适用于RTX。该代码使用关键部分。我尝试对RTX的关键部分使用与FreeRTOS(BASEPRI)相同的实现,但我经常最终使用UsageFault。 我知道RTX在代码中广泛使用了SVC。

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

稍后编辑(已解决):事实证明问题与分配给SysTick的优先级有关。它首先被设置为最低优先级,但是,一段代码,某处将SysTick设置为非常高的优先级。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

当然,包括程序计数器在内的所有其他寄存器也可能已损坏。 UsageFault发生在未定义的指令,未对齐的内存访问中 - 如果返回是在堆栈损坏的情况下执行的,则可能是其中任何一种,因为返回可能在任何地方结束。您甚至可能会发现更改代码会导致不同的错误类型。在没有看到代码的情况下,无法确定原因,但可能的问题是本地数据缓冲区溢出或者分配的堆栈空间不足。

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