【发布时间】:2018-04-03 00:06:35
【问题描述】:
我有一个带有 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 之间可能导致问题的任何其他差异吗?
Later Edit(Solved):事实证明问题与分配给 SysTick 的优先级有关。它首先被设置为应有的最低优先级,但是,一段代码在某处将 SysTick 设置为非常高的优先级。
谢谢!
【问题讨论】:
-
你可能已经溢出了堆栈。如果你像 PC 一样对 uC 进行编程,你会再次遇到类似的问题
-
@PeterJ_01 :我不知道你评论的第二句话可能意味着什么。
标签: arm stm32 rtos cortex-m rtx