简单的中断处理程序

// 简单的中断处理程序
// 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.优秀的中断处理程序

保存中断异常发生时的程序指针和寄存器、栈指针

切换到管理模式执行中断服务函数,此时可被中断,巧妙实现中断嵌套

系统处于管理模式的时间占比大,可被中断的时间占比大,实时性高

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐