(ARM汇编)在处理器模式之间访问分区寄存器的最快方法?
我正在为RTOS写一个中断服务程序。 在ISR开始时,ARM寄存器LR_irq , LR_svc , R12 - R0和SPSR_irq必须按照正确的顺序被推送到被中断的任务堆栈。 所有任务都以supervisor(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寄存器?
链接地址: http://www.djcxy.com/p/72561.html上一篇: (ARM assembly) Fastest way to access banked registers between processor modes?