Cortex-M4 锁定

标签 c gcc arm stm32 cortex-m

我正在尝试调试基于运行 FreeRTOS 的 STM32F3 uC 的应用程序。我已在应用程序的线程上下文中的随机位置手动将 PSP 设置为无效值(例如 0),希望触发 memManageFault/busFault/usageFault/hardFault 处理程序。不幸的是,没有执行任何故障处理程序,但核心在第一次推送到无效堆栈时锁定。我错过了什么?

锁定状态的更多详细信息:

SCB->SHCSR:0x74001(所有三个故障处理程序均已启用,总线故障待处理,memFault 处于事件状态)
SCB->HFSR:0x40000000(即使定义并启用了所有处理程序,故障也会升级为硬故障)
SCB->CFSR:0x28601(BFAR有效,精确错误)
SCB->BFAR/SCB->MMFAR: 0xfffffff7(我认为 sub 之后的 SP 是错误的)

PRIMASK/FAULTMASK/BASEPRI:0
MSP:0x2000ffe0(仍然有效,处理程序应该运行得很好)

欢迎任何想法。

最佳答案

看来核心又是对的,而我是错的。我犯的错误是,尽管我已将 HardFault_Handler 实现为裸函数,但所有其他故障处理程序都是用 C 实现的简单应用程序故障 Hook ,试图在它们中断的任何上下文中访问堆栈。不用说,事情很快就变脏了。
在 asm 中实现所有处理程序解决了核心锁定损坏的 SP 的问题。

关于Cortex-M4 锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43982894/

相关文章:

C "warning: initialization from incompatible pointer type"当函数有一个数组作为参数时

C编程: how to avoid code duplication without losing clarity

c - RHEL6 中线程的最大虚拟内存分配

c - C中的多行注释警告是什么意思?

linux - 我可以在内核代码中使用 vpush/vpop 吗?

c - 处理 ARM 芯片的保留寄存器位

ARM 上的 C++ 结构成员对齐和打包要求

c - 为什么我的共享内存中的链表总是导致段错误?

c - 使用带有 while 循环的 scanf 输入两个单独的字符串

c++ - 静态链接整个程序