【简介】
使用Cortex M处理器一直有个疑问如果在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 的异常优先级定义。

按照上面的中断优先级在Usage Fault 中断中触发Bus Fault 的异常就会触发中断嵌套,在异常处理中再一次触发了异常。

上述试验已经验证了在hardfault 中触发hardfault 因为当前fault 正在执行没有退出所以不能会卡在触发异常的现场。
我要赚赏金
