Cortex-M4锁定

Cortex-M4锁定,c,gcc,arm,stm32,cortex-m,C,Gcc,Arm,Stm32,Cortex M,我正在尝试调试基于运行FreeRTOS的STM32F3 uC的应用程序。我已手动将PSP设置为无效值,例如,在应用程序中线程上下文中的随机位置设置为0,希望触发memManageFault/busFault/usageFault/hardFault处理程序。不幸的是,没有执行任何错误处理程序,但是内核在第一次推送到无效堆栈时锁定。我错过了什么 有关锁定状态的更多详细信息: SCB->SHCSR:0x74001所有三个故障处理程序均已启用,busFault挂起,memFault激活 SCB->HF

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

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

SCB->SHCSR:0x74001所有三个故障处理程序均已启用,busFault挂起,memFault激活 SCB->HFSR:0x40000000故障升级为硬故障,即使定义并启用了所有处理程序 SCB->CFSR:0x28601 BFAR有效,精确错误 SCB->BFAR/SCB->MMFAR:0xfffffff7 sub后的SP错误,我假设

PRIMASK/FAULTMASK/BASEPRI:0 MSP:0x2000ffe0仍然有效,处理程序应该可以正常运行


欢迎任何想法。

总线故障挂起,memFault活动-memFault已导致总线错误-并且它会终止微异常堆栈使用与当前上下文相同的堆栈。通过提供无效的堆栈指针,您已经阻止了任何异常处理程序能够完成。锁定专门针对这种情况。

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

是否有任何相关代码可以添加到您的问题中?@JeffUK none真的,我认为应用程序中没有任何特定于该问题的内容没有理由假设大部分芯片从一个mcu匹配到另一个mcu,即使两者都是STM32。您已经一个接一个地访问了外围设备并解决了这些差异?您使用的是什么具体的from和to芯片?@old_timer对不起,您是想发表这些评论来回答我的问题吗?顺便说一句,uC本身是STM32F303RE,根据[在硬故障/NMI处理程序中发生故障时,堆芯将锁定,我是否理解正确?为什么您认为这种情况会升级为硬故障,我可以做些什么来避免它?据我所知,这就是为什么即使堆叠失败,至少硬故障处理程序应该能够运行。处理程序本身在完整的MSP上运行.对。这就是为什么我认为在上面的场景中,处理程序应该能够运行,即使提供错误的调试信息,因为线程上下文中的stackframe不可用。但我可能错了…堆栈发生在异常输入之前。您破坏了PSP,所以您终止了线程,并且终止了到达异常的进程处理程序。