我正在研究在 stm32f103rb 中实现的 操作系统。我到达02-ContextSwitch-1章节,发现程序崩溃并抛出此错误。
qemu:致命:尝试在 RAM 或 ROM 之外的 0x681b4b14 处执行代码经过一番调试,发现问题出在activate函数上。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] 中止(核心转储)
.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
stm32-p103 只有 20K 内存,而不是链接器脚本期望的 40K 。因此,堆栈恰好被放置在不存在的内存中。将链接描述文件更改为:
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K