ARM 皮质 M4 SVC_Handler "UsageFault"

ARM Cortex M4 SVC_Handler "UsageFault"

我正在为个人迷你 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

我的上下文切换:

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 评估板。

问题是我的中断向量都是偶数(ARM 模式)。当 T 位为 0(向量编号的最低有效位)时尝试执行指令会导致错误或锁定。由于 Cortex-M 仅在 Thumb2 状态下运行,因此我必须通过在上下文切换程序集中的中断处理程序上方放置“.thumb_func”来指示我的异常是处于拇指状态的 运行。