我正在为一个个人迷你ARM内核项目创建一个上下文切换程序,该上下文切换程序完全用汇编语言编写。问题是,当我进行SVC调用(svc 0)时,我进入了SVC_Handler,但当我试图执行下一条指令时,我进入了不同的处理程序(“UsageFault_Handler”)。在弹出SVC_Handler中的任何寄存器之前,故障发生。
下面是我的gdb屏幕的寄存器转储(就在我进入SVC_Handler并遇到UsageFault_Handler之后):
(gdb) i r
r0 0x1 1
r1 0x20000bcc 536873932
r2 0x40004404 1073759236
r3 0x1 1
r4 0x0 0
r5 0xc 12
r6 0x3 3
r7 0x20000fe4 536874980
r8 0x1 1
r9 0x0 0
r10 0xb 11
r11 0xa 10
r12 0x2 2
sp 0x2001ffa8 0x2001ffa8
lr 0xfffffff1 4294967281
pc 0x8000188 0x8000188 <UsageFault_Handler>
cpsr 0x3 3
字符串
我的context switch:
activate:
cpsie i
/* save kernel state into msp */
mrs ip, msp
push {r4-r11,ip,lr}
/* retrieve routine parameters and switch to the process stack psp */
ldmfd r0!, {ip,lr}
msr control, ip
isb
msr psp, r0
/* software stack frame. load user state */
pop {r4-r11}
/* hardware stack frame. the cpu pops r0-r3, r12 (IP), LR, PC, xPSR automatically */
/* jump to user task*/
bx lr
SVC_Handler:
/* automatically use the msp as the sp when entering handler mode */
/* pop msp stack */
pop {r4-r11,ip,lr}
mov sp, ip
/* back to the thread mode if no other active exception */
bx lr
型
不确定是什么原因导致了这个问题,因为我确保了中断被启用,并将SVC优先级初始化为0x0(最高优先级)。此外,我使用的是ARM Cortex M4 STM32F411E评估板。
1条答案
按热度按时间cu6pst1q1#
问题是我的中断向量都是偶数(ARM模式)。当T位为0(向量数的最低有效位)时,尝试执行指令会导致故障或锁定。由于Cortex-M只能在Thumb 2状态下运行,因此我必须通过将“.thumb_func”放置在上下文切换程序集中的中断处理程序上方来指示我的异常正在Thumb状态下运行。