调试学习章节

发布时间:2026/7/17 1:53:53
调试学习章节 重要的3张图片一.CPU模式Thread正常运行时处于Thread模式Handler发生异常时进入Handler模式二.SP寄存器代码里使用SP寄存器时它可能是MSP或PSP这由CONTROL寄存器决定一般而言 裸机只使用MSP RTOS里任务使用PSP 异常处理函数必定使用MSP栈的使用Thread模式下可以使用MSP、PSPHandler模式下必定使用MSP三.栈帧栈帧指的是当异常发生时硬件会帮我们自动把一些寄存器压栈这些寄存器被称为栈帧。说明当异常发生时硬件在自动压栈的同时会将 LR链接寄存器赋值为一个特殊的“异常返回标志”EXC_RETURN而不是保存普通函数调用的返回地址。当异常处理函数执行完毕CPU 执行 BX LR 指令试图跳转到 LR 所存的地址时它发现该值是一个 32 位的特殊值而非普通的 PC 地址于是硬件不会真的去该地址取指而是触发“异常返回流程”从堆栈中自动弹出恢复之前硬件压栈的寄存器并将 PC 设置为被中断前的下一条指令地址从而实现无缝恢复现场。根据这个特殊值我们可以发现bit[0]1bit[1]0bif[2]: 1:说明发生异常前的sp为psp0:说明发生异常前的sp为msp但此时异常时sp为mspbit[3]: 1:说明发生异常前cpu为Thread模式0:说明发生异常前cpu为Handler模式bit[4]: 1:说明使用了FPU用的栈帧多一些寄存器如上图0:说明没使用FPU用的栈帧如上图。四.BUG当发生bug时观察sp指向的栈1.看PC值2.看LR值3.如果PC和LR都被破坏了的话看疑似LR值。bit0肯定为1因为为1才是Thumb指令Cortex-M系列只支持Thumb指令。一般为0x08开头因为位于ROM上。addr-4为BL或者BLX指令