韦东山Linux嵌入式课程社区
直播中

闫玮婧

8年用户 162经验值
私信 关注

为什么中断的过程中系统会自动返回?

第一期视频,中断控制器 一节讲了中断的原理,基本了解但是又不会自己写代码
针对实例代码,有一处疑问:
在HandIRQ中断处理程序中
  • HandleIRQ:
  •     sub lr, lr, #4                      @ 计算返回地址
  •     stmdb   sp!,    { r0-r12,lr }       @ 保存使用到的寄存器
  •                                         @ 注意,此时的sp是中断模式的sp
  •                                         @ 初始值是上面设置的3072
  •     ldr lr, =int_return              @ 设置调用ISR即EINT_Handle函数后的返回地址
  •     ldr pc, =EINT_Handle        @ 调用中断服务函数,在interrupt.c中
  • int_return:
  •     ldmia   sp!,    { r0-r12,pc }^   @ 中断返回, ^表示将spsr的值复制到cpsr

复制代码
ISR返回地址需要ldr lr,=int_return 来实现.
为什么这样一设置,处理完interrupt.c里的EINT_Handle函数,系统就会自动返回.

回帖(3)

高欢

2019-8-21 09:37:36
lr表示返回地址的寄存器
举报

高川

2019-8-21 09:55:51
先谢谢楼上的回答.
我还有一点疑问:
主程序在调用ISR中断服务程序之前,先设置好中断返回地址(通过指令sub lr, lr, #4),这个我能理解,但是为何ISR也需要返回地址呢?
问题可能比较低级,请多多见谅
举报

俞旸

2019-8-21 10:10:08
sub lr, lr, #4  这里才是真正的返回地址
到后面只是恢复 地址而已
为什么是这条指令 sub lr, lr, #4
我也表示不理解
举报

更多回帖

发帖
×
20
完善资料,
赚取积分