You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:02:47