我正在为RTOS编写中断服务程序。在ISR开始时,ARM注册 LR_irq , LR_svc , R12 - R0 和必须按照该顺序将SPSR_irq 推送到被中断任务的堆栈。所有任务都以管理程序( svc )模式运行,因此使用 SP_svc 堆栈指针堆叠寄存器。我写了下面的汇编:
SRSFD SP!, #0x13 @ Push the IRQ banked SPSR_irq and LR_irq registers to the SVC stack (in the order written)
CPS #0x13 @ Enter supervisor mode to store the remaining registers on the SVC stack
STMFD SP, {R0-R12} @ Store remaining registers
@ REARRANGING
LDMFD SP!, {R0} @ LR_irq => R0
LDMFD SP!, {R1} @ SPSR => R1
STMFD SP!, {R0} @ Push LR_irq and then the LR_svc
STMFD SP!, {LR} @ Push LR_svc
SUB SP, SP, #52 @ Move back to the top of the stack
STMFD SP!, {R1} @ Push SPSR to the stack in the correct place (it needs to be at the top)
总之,发生中断,处理器转向上面 irq 模式中显示的代码,并执行以下步骤:
基本上,我想知道如果没有重新安排步骤,是否有办法实现这一目标。 是否有比SRSFD更灵活的指令,可以使用svc堆栈指针以正确的顺序堆叠存储的irq寄存器?