我正在尝试调试基于运行FreeRTOS的STM32F3 uC的应用程序。我已经在应用程序的线程上下文中的随机位置手动将PSP设置为无效值(例如0),期望我的memManageFault / busFault / usageFault / hardFault处理程序触发。不幸的是,没有一个故障处理程序被执行,但是核心在第一次推送到无效堆栈时锁定。我错过了什么?
锁定状态的更多细节:
SCB-> SHCSR:0x74001(所有三个faultHandler都已启用,busFault挂起,memFault处于活动状态)
SCB-> HFSR:0x40000000(即使已定义并启用了所有处理程序,故障也会升级到hardFault)
SCB-> CFSR:0x28601(BFAR有效,精确错误)
SCB-> BFAR / SCB-> MMFAR:0xfffffff7(sub之后的错误SP,我假设)
PRIMASK / FAULTMASK / BASEPRI:0
MSP:0x2000ffe0(仍然有效,处理程序应该运行得很好)
欢迎任何想法。
答案 0 :(得分:1)
似乎再次核心是对的,我错了。我犯的错误是虽然我已经将HardFault_Handler实现为裸函数,但所有其他错误处理程序都是在C中实现的简单应用程序故障挂钩,试图在它们中断的任何上下文中访问堆栈。毋庸置疑,事情很快就会变脏 在asm中实现所有处理程序解决了核心锁定已损坏SP的问题。
答案 1 :(得分:0)
busFault挂起,memFault活动 - memFault导致busError - 并且它杀死了微观
答案 2 :(得分:0)
异常堆栈使用与当前上下文相同的堆栈。通过提供无效的堆栈指针,您已经阻止了任何异常处理程序能够完成。 Lockup专门解决了这种情况。