STM32 mini-arm-os中pop指令未恢复寄存器值致程序崩溃原因
基于STM32F103RB的mini-arm-os上下文切换崩溃问题
我在研究基于STM32F103RB实现的mini-arm-os,推进到02-ContextSwitch-1章节时,程序崩溃并抛出以下错误:
qemu: fatal: Trying to execute code outside RAM or ROM at 0x681b4b14
R00=00000003 R01=00000000 R02=4000440c R03=00000000
R04=2000a000 R05=08000129 R06=08000191 R07=08000197
R08=af00b480 R09=681b4b17 R10=f0434a16 R11=60130305
R12=01000000 R13=00000024 R14=681b4b15 R15=681b4b14
PSR=00000173 ---- T svc32
FPSCR: 00000000
make: *** [Makefile:22: qemu] Aborted (core dumped)
经调试定位到问题出在activate函数中,函数代码如下:
.thumb .syntax unified .global activate activate: /* save kernel state */ mrs ip, psr push {r4, r5, r6, r7, r8, r9, r10, r11, ip, lr} /* switch to process stack */ msr psp, r0 mov r0, #3 msr control, r0 /* load user state */ pop {r4, r5, r6, r7, r8, r9, r10, r11, lr} /* jump to user task */ bx lr
函数执行前的寄存器状态:
r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20009bd0 0x20009bd0 lr 0x800011f 134218015
执行完pop指令后,寄存器状态未恢复为初始值:
r4 0x2000a000 536911872 r5 0x8000129 134218025 r6 0x8000191 134218129 r7 0x8000197 134218135 r8 0xaf00b480 -1358908288 r9 0x681b4b17 1746619159 r10 0xf0434a16 -264025578 r11 0x60130305 1611858693 r12 0x1000000 16777216 sp 0x24 0x24 lr 0x681b4b15 1746619157
这导致程序跳转到非法地址0x681b4b15,触发上述错误。请问该问题的原因是什么?
补充信息:R0-R3寄存器未出现异常,执行前后状态如下:
执行前:
r0 0x0 0 r1 0x0 0 r2 0x4000440c 1073759244 r3 0x0 0
执行后:
r0 0x3 3 r1 0x0 0 r2 0x4000440c 1073759244 r3 0x0 0
内容的提问来源于stack exchange,提问作者EmTor
相关产品推荐
相关产品推荐

