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.


person smolaie    schedule 06.08.2018    source источник
comment
Вы читали документацию?   -  person 0___________    schedule 06.08.2018
comment
У меня есть, но я не думаю, что приоритет был проблемой, как я думал.   -  person smolaie    schedule 06.08.2018
comment
Какой у тебя микро? STM32 недостаточно. Вы руководство программиста читали?   -  person 0___________    schedule 06.08.2018
comment
Я разрабатываю на оценочной плате ARM Cortex M4 STM32F411E. Я прочитал руководство по программированию (PM0214) и прямо сейчас играю с регистрами разрешения прерывания и приоритета. Но я думаю, что если бы проблема заключалась в отключении или приоритете прерывания, то я бы не зашел так далеко, чтобы войти в SVC_Handler, поэтому проблема должна быть в чем-то другом.   -  person smolaie    schedule 06.08.2018
comment
Да, заставить прерывания правильно работать на ARM Cortex-M — это настоящее божественное чудо. Любите это дело.   -  person smolaie    schedule 07.08.2018


Ответы (1)


Проблема заключалась в том, что все мои векторы прерываний были четными числами (режим ARM). Попытка выполнить инструкции, когда бит T равен 0 (младший значащий бит векторных чисел), приводит к ошибке или блокировке. Поскольку Cortex-M работает только в состоянии Thumb2, мне пришлось указать, что мое исключение работает в состоянии большого пальца, поместив «.thumb_func» над моим обработчиком прерываний в моей сборке переключателя контекста.

person smolaie    schedule 13.08.2018