0

我有一个带有 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 设置为非常高的优先级。

谢谢!

4

1 回答 1

0

当函数返回时,它的堆栈指针被恢复,如果堆栈被破坏,则可能会恢复无效值,因此 SP 中的值不是特别有用或提供信息。

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

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

于 2017-10-22T22:06:27.213 回答