【问题标题】:STM32 RTX Usage Fault PSP 0x00000020STM32 RTX 使用故障 PSP 0x00000020
【发布时间】: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


【解决方案1】:

当一个函数返回它的堆栈指针被恢复时,如果堆栈被破坏,一个无效的值可能会被恢复,所以 SP 中的值不是特别有用或信息丰富。

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

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

【讨论】:

  • 感谢您的回答。我忘记提及的一件事是代码在没有操作系统的情况下也能完美运行。在我包含 RTX 后,错误不断出现,而不是同时出现。
  • 在 RTOS 中,每个任务都有一个用户定义大小的独立堆栈。 ARM 链接器具有生成淀粉使用分析的选项。使用它来检查您的任务入口点的堆栈要求,以及main()。主堆栈将继续用于中断。
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2020-08-12
  • 2020-11-12
  • 2021-01-29
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多