【简介】
使用Cortex 处理器一直有个疑问如果在hardfault 中触继续触发 hardfault 的异常事件会发生什么?抱着这个想法本地在hardfault 的异常处理中调用如下的测试接口继续触发hardfault 异常。
static int _IllegalWrite(void) {
int r;
volatile unsigned int* p;
r = 0;
p = (unsigned int*)0x00000000; // 0x00100000-0x07FFFFFF is reserved on STM32F4
// F44F1380 mov.w r3, #0x00100000
*p = 0x00BADA55;
// 4A03 ldr r2, =0x00BADA55
// 601A str r2, [r3] <- Illegal write is done here
return r;
// 9B00 ldr r3, [sp]
// 4618 mov r0, r3
// B002 add sp, sp, #8 <- Fault might be raised here
// 4770 bx lr
}本地触发hardfault 后发现代码attach 上去发现mcu 会卡死在异常的写操作位置。

此时发现hardfaut 正在处理中,此时在触发hardfault 因为此时触发的是同一个中断,当前的hardfaut 的一场还在处理中新触发的异常则是不会被执行。 在HardFault 异常处理函数内部又触发新的 HardFault,导致 CPU 陷入死循环的异常嵌套,最终表现为芯片卡死的现象。因为Cortex-M处理器的中断无法嵌套相同优先级的中断,我们可以在Usage fault 中触发hardfault 的处理在验证下是否会进入hard fault.以下是cortex-m 的异常优先级定义。

我要赚赏金
