一步步写嵌入式操作系统 中断处理

简单的中断处理程序

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值