简单的中断处理程序
// 简单的中断处理程序
// 1.获取被中断模式的将要执行的指令的地址到LR
// 2.将LR压入中断模式栈
// 3.将pc置为公共的中断服务函数入口地址,并记录下一条指令地址到LR
// 4.从公共的中断服务函数返回
// 5.从spsr恢复被中断模式的cpsr(被中断模式允许中断)
// 6.中断模式出栈,恢复LR
// 7.将PC置为LR
// 对应的代码:
// sub lr,lr,#0x4
// stmfd sp!,{lr}
// bl common_irq_handler
// mrs lr,spsr
// msr cpsr_c,lr
// ldmfd sp!,{lr}
// mov pc,lr
复杂的中断处理程序
@ __vector_irq:
@ sub r14,r14,#0x4
@ stmfd r13!,{r14}
@ mrs r14,spsr
@ stmfd r13!,{r14}
@ CHANGE_TO_SVC
@ stmfd r13!,{r0,r1,r2,r3}
@ bl common_irq_handler
@ ldmfd r13!,{r0,r1,r2,r3}
@ CHANGE_TO_IRQ
@ ldmfd r13!,{r14}
@ msr spsr,r14
@ ldmfd r13!,{pc}^
优秀的中断处理程序
@ __vector_irq:
@ sub r14,r14,#0x4
@ str r14,[r13,#-0x4]
@ mrs r14,spsr
@ str r14,[r13,#-0x8]
@ str r0,[r13,#-0xc]
@ mov r0,r13
@ CHANGE_TO_SVC
@ str r14,[r13,#-0x8]!
@ ldr r14,[r0,#-0x4]
@ str r14,[r13,#-0x4]
@ ldr r14,[r0,#-0x8]
@ ldr r0,[r0,#-0xc]
@ stmdb r13!,{r0-r3,r14}
@ bl common_irq_handler
@ ldmia r13!,{r0-r3,r14}
@ msr spsr,r14
@ ldmfd r13!,{r14,pc}^
总结:
1.简单的中断处理程序:
保存中断异常发生时的程序指针和寄存器、栈指针
在中断异常模式执行中断服务程序,此时不可被中断,无法中断嵌套
2.复杂的中断处理程序:
保存中断异常发生时的程序指针和寄存器、栈指针
切换到管理模式执行中断服务函数,此时可被中断,巧妙实现中断嵌套
3.优秀的中断处理程序
保存中断异常发生时的程序指针和寄存器、栈指针
切换到管理模式执行中断服务函数,此时可被中断,巧妙实现中断嵌套
系统处于管理模式的时间占比大,可被中断的时间占比大,实时性高