|
IRQ.S 的解析
引用:
[blockquote]AREA IRQ,CODE,READONLY
MACRO ;宏定义开始
$IRQ_Label HANDLER $IRQ_Exception_Function ;宏名为 HANDLER,$IRQ_Exception_Function--宏的参数
EXPORT $IRQ_Label ;输出的标号
IMPORT $IRQ_Exception_Function ;引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ;LR中保存的是下下一条指令,故这里需要-4
STMFD SP!, {R0-R3, R12, LR} ;保存任务环境
MRS R3, SPSR ;保存状态
STMFD SP!, {R3}
STMFD SP, {LR}^ ;保存用户状态的LR,注意不能回写(后面有^符号),SP仍为 IRQ 模式的寄存器, STMFD 被翻译成 STMDB(先减),LR存入堆栈,但 SP 未更新,所以下面要调整
SUB SP, SP, #4 ;调整
MSR CPSR_c, #(NoInt | SYS32Mode) ;切换到系统模式
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {LR}^ ; 恢复用户状态的LR,注意不能回写
ADD SP, SP, #4 ;调整堆栈指针
LDMFD SP!, {R3}
MSR SPSR_cxsf, R3
LDMFD SP!, {R0-R3, R12, PC}^ ;
MEND[/blockquote] |
|