《龙虾OpenClaw系列:从嵌入式裸机到芯片级系统深度实战60课》 042、异常处理机制:精确异常与非精确异常的区别
OpenClaw系列:从嵌入式裸机到芯片级系统深度实战042、异常处理机制:精确异常与非精确异常的区别一次让我通宵的调试2018年做某款车规级MCU的BSP时,遇到一个诡异现象:中断服务程序里读一个外设状态寄存器,返回值偶尔是错的。更离谱的是,在ISR入口处加一个NOP指令,错误就消失了。当时我以为是编译器优化问题,折腾了一整晚加volatile、加内存屏障,全没用。第二天老工程师过来看了一眼,说:“你看看异常返回地址对不对。”我打印出来一看——返回地址指向了中断触发指令的下一条,而不是触发指令本身。这就是典型的非精确异常。从那以后,我养成了一个习惯:写底层代码前,先搞清楚当前处理器用的是精确异常还是非精确异常模型。这个区别,直接决定了你的调试策略、中断嵌套设计、甚至RTOS的上下文切换能不能跑稳。精确异常:教科书里的乖孩子精确异常(Precise Exception)的定义很直白:异常发生时,处理器能保证所有在异常指令之前的指令都已完成,而异常指令及其之后的指令都未执行。换句话说,异常返回地址就是那条触发异常的指令地址。ARM Cortex-M系列就是精确异常的典型代表。你写一个除零操作,PC会精确停在除法指令上,压栈的xPSR里甚至能告诉你具体是哪条指令出了问题。这种模型下,调试器可以完美回溯现场,单步、断点、变量监视全都能用。精确异常的实现代价是