Cortex-m3 异常切换进Trumble模式

文章探讨了在STM32F107VC微控制器上使用Cortex-M3处理器进行堆栈恢复时遇到的问题,特别是在执行BX LR指令时出现的异常情况。通过对比执行前后寄存器的状态,分析可能的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MCU型号是STM32F107VC, Processor 是 Cortex-m3。

    以下是从堆栈中恢复现场后的跳转。 在执行BX  LR的过程中遇到问题。

MSR IPSR,a1              
 80005e6:	f380 8805 	msr	IPSR, r0

LDMIA sp!,{r0-r12,lr}     //Recover all registers and resume
 80005ea:	e8bd 5fff 	ldmia.w	sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
 
bx lr                         //at point of interrupt
 80005ee:	4770      	bx	lr


执行0x80005ee处代码,Jlink 仿真器的错误提示。

 Performing single step...
WARNING: T-bit of XPSR is 0 but should be 1. Changed to 1.
...Target halted (DBGRQ, PC = 0x08000D14)

执行前后的寄存器Dump结果


执行0x80005e6 前

0x00000000 in ?? ()
(gdb) source dump_reg.gdb
R0 = 01000020, R1 = 20002564, R2 = 01000000, R3 = 00000001
R4 = 20000060, R5 = 20000060, R6 = 20000714, R7 = 00000000
R8 = 00000000, R9 = 00000000, R10= 20000064, R11= 20000CC0
R12= 20000CC4, R13= 20000C88, MSP= 20000C88, PSP= D478C6E4
R14(LR) = FFFFFFF9, R15(PC) = 080005E6
XPSR 6100000F, APSR 60000000, EPSR 01000000, IPSR 0000000F
CFBP 00000000, CONTROL 00, FAULTMASK 00, BASEPRI 00, PRIMASK 00
Reading from address 0xE000ED24 (Data = 0x00000800)
Reading from address 0xE000ED28 (Data = 0x00)
Reading from address 0xE000ED29 (Data = 0x00)
Reading from address 0xE000ED2A (Data = 0x0000)
Reading from address 0xE000ED2C (Data = 0x00000000)
Reading from address 0xE000ED30 (Data = 0x00000002)
Reading from address 0xE000ED34 (Data = 0xE000EDF8)
Reading from address 0xE000ED38 (Data = 0xE000EDF8)
Reading from address 0xE000ED3C (Data = 0x00000000)

执行0x80005EA前

R0 = 01000020, R1 = 20002564, R2 = 01000000, R3 = 00000001
R4 = 20000060, R5 = 20000060, R6 = 20000714, R7 = 00000000
R8 = 00000000, R9 = 00000000, R10= 20000064, R11= 20000CC0
R12= 20000CC4, R13= 20000C88, MSP= 20000C88, PSP= D478C6E4
R14(LR) = FFFFFFF9, R15(PC) = 080005EA
XPSR 6100000F, APSR 60000000, EPSR 01000000, IPSR 0000000F
CFBP 00000000, CONTROL 00, FAULTMASK 00, BASEPRI 00, PRIMASK 00
Reading from address 0xE000ED24 (Data = 0x00000800)
Reading from address 0xE000ED28 (Data = 0x00)
Reading from address 0xE000ED29 (Data = 0x00)
Reading from address 0xE000ED2A (Data = 0x0000)
Reading from address 0xE000ED2C (Data = 0x00000000)
Reading from address 0xE000ED30 (Data = 0x00000001)
Reading from address 0xE000ED34 (Data = 0xE000EDF8)
Reading from address 0xE000ED38 (Data = 0xE000EDF8)
Reading from address 0xE000ED3C (Data = 0x00000000)

执行0x80005EE前


R0 = 00000000, R1 = 00000000, R2 = 00000000, R3 = 00000000
R4 = 00000000, R5 = 00000000, R6 = 00000000, R7 = 00000000
R8 = 00000000, R9 = 00000000, R10= 200008C8, R11= 20000CC0
R12= 20000CC0, R13= 20000CC0, MSP= 20000CC0, PSP= D478C6E4
R14(LR) = 08000D14, R15(PC) = 080005EE
XPSR 6100000F, APSR 60000000, EPSR 01000000, IPSR 0000000F
CFBP 00000000, CONTROL 00, FAULTMASK 00, BASEPRI 00, PRIMASK 00
Reading from address 0xE000ED24 (Data = 0x00000800)
Reading from address 0xE000ED28 (Data = 0x00)
Reading from address 0xE000ED29 (Data = 0x00)
Reading from address 0xE000ED2A (Data = 0x0000)
Reading from address 0xE000ED2C (Data = 0x00000000)
Reading from address 0xE000ED30 (Data = 0x00000001)
Reading from address 0xE000ED34 (Data = 0xE000EDF8)
Reading from address 0xE000ED38 (Data = 0xE000EDF8)
Reading from address 0xE000ED3C (Data = 0x00000000)


执行0x80005EE后

R0 = 00000000, R1 = 00000000, R2 = 00000000, R3 = 00000000
R4 = 00000000, R5 = 00000000, R6 = 00000000, R7 = 00000000
R8 = 00000000, R9 = 00000000, R10= 200008C8, R11= 20000CC0
R12= 20000CC0, R13= 20000CC0, MSP= 20000CC0, PSP= D478C6E4
R14(LR) = 08000D14, R15(PC) = 08000D14
XPSR 6100000F, APSR 60000000, EPSR 01000000, IPSR 0000000F
CFBP 00000000, CONTROL 00, FAULTMASK 00, BASEPRI 00, PRIMASK 00
Reading from address 0xE000ED24 (Data = 0x00000800)
Reading from address 0xE000ED28 (Data = 0x00)
Reading from address 0xE000ED29 (Data = 0x00)
Reading from address 0xE000ED2A (Data = 0x0000)
Reading from address 0xE000ED2C (Data = 0x00000000)
Reading from address 0xE000ED30 (Data = 0x00000001)
Reading from address 0xE000ED34 (Data = 0xE000EDF8)
Reading from address 0xE000ED38 (Data = 0xE000EDF8)
Reading from address 0xE000ED3C (Data = 0x00000000)





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值