Что есть:
Вот такой код обработчика в ассемблере:
Код
IRQHandler:
/* Save interrupt context on the stack to allow nesting */
sub lr, lr, #4
stmfd sp!, {lr}
mrs lr, SPSR
stmfd sp!, {r0, lr}
// save VFP/Neon data registers
VPUSH {d0-d15} // same as s0-s31
// save VFP/Neon FPSCR register
FMRX r0, fpscr
stmfd sp!, {r0-r3, r4, r12, lr}
ldr r2, =IRQHandlerSafe
mov lr, pc
bx r2 /* And jump... */
ldmia sp!, {r0-r3, r4, r12, lr}
// restore VFP/Neon FPSCR register
FMXR fpscr, r0
// restore VFP/Neon data registers
VPOP {d0-d15} // same as s0-s31
ldmia sp!, {r0, lr}
msr SPSR_cxsf, lr
ldmia sp!, {pc}^
/* Save interrupt context on the stack to allow nesting */
sub lr, lr, #4
stmfd sp!, {lr}
mrs lr, SPSR
stmfd sp!, {r0, lr}
// save VFP/Neon data registers
VPUSH {d0-d15} // same as s0-s31
// save VFP/Neon FPSCR register
FMRX r0, fpscr
stmfd sp!, {r0-r3, r4, r12, lr}
ldr r2, =IRQHandlerSafe
mov lr, pc
bx r2 /* And jump... */
ldmia sp!, {r0-r3, r4, r12, lr}
// restore VFP/Neon FPSCR register
FMXR fpscr, r0
// restore VFP/Neon data registers
VPOP {d0-d15} // same as s0-s31
ldmia sp!, {r0, lr}
msr SPSR_cxsf, lr
ldmia sp!, {pc}^
И его продолжение в C:
Код
void IRQHandlerSafe(void)
{
/* const uint32_t icchpir = */ (void) INTC.ICCHPIR;
const uint32_t icciar = INTC.ICCIAR;
(* intc_func_table [icciar & 0x03FF]) (); /* Call interrupt handler */
INTC.ICCEOIR = icciar & 0x1FFF;
}
{
/* const uint32_t icchpir = */ (void) INTC.ICCHPIR;
const uint32_t icciar = INTC.ICCIAR;
(* intc_func_table [icciar & 0x03FF]) (); /* Call interrupt handler */
INTC.ICCEOIR = icciar & 0x1FFF;
}
Сейчас всё работает в случае, если среди прерываний нет разделения на группы с меньшим и большим приоритетами.
Стоит добавить, получается "каша" - похоже, что выполнение более приоритетного прерывания не рапрещает выполнение менее приоритетного.
Установка при инициализации процессора значения в регистре priority mask на менее приоритетное прерывание - оно естественно запрещается...
Вопрос - как это должно тут выглядеть? (на STM32 с архитектурой Cortex-M4 и Cortex-M7 это всё работает, с использованием тамошних механизмов BASEPRI и остального).
зы: картинки просто как иллюстрация.