(ARM汇编)在处理器模式之间访问分组寄存器的最快方法?

时间:2017-11-16 22:10:49

标签: assembly optimization arm embedded micro-optimization

我正在为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 模式中显示的代码,并执行以下步骤:

  1. SRSFD LR_irq SPSR_irq 寄存器推送到被中断任务的堆栈(0x13表示 svc 模式,因此使用 SP_svc 堆栈指针。)
  2. CPS 将处理器从 irq 模式移至 svc 模式。
  3. STMFD 使用 SP_svc 堆栈指针堆叠 R0 - R12 ,因为我们现在位于 svc 模式。
  4. 不那么好:因为步骤1中的寄存器没有按正确顺序推送,所以我现在必须重新排列堆栈。
  5. 基本上,我想知道如果没有重新安排步骤,是否有办法实现这一目标。 是否有比SRSFD更灵活的指令,可以使用svc堆栈指针以正确的顺序堆叠存储的irq寄存器?

0 个答案:

没有答案