新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2022-9-5
- 在线时间
- 3 小时
|
- IRQ_Handler:
- push {lr} /* 保存lr地址 */
- push {r0-r3, r12} /* 保存r0-r3,r12寄存器 */
- mrs r0, spsr /* 读取spsr寄存器 */
- push {r0} /* 保存spsr寄存器 */
- mrc p15, 4, r1, c15, c0, 0 /* 从CP15的C0寄存器内的值到R1寄存器中
- * 参考文档ARM Cortex-A(armV7)编程手册V4.0.pdf P49
- * Cortex-A7 Technical ReferenceManua.pdf P68 P138
- */
- add r1, r1, #0X2000 /* GIC基地址加0X2000,也就是GIC的CPU接口端基地址 */
- ldr r0, [r1, #0XC] /* GIC的CPU接口端基地址加0X0C就是GICC_IAR寄存器,
- * GICC_IAR寄存器保存这当前发生中断的中断号,我们要根据
- * 这个中断号来绝对调用哪个中断服务函数
- */
- push {r0, r1} /* 保存r0,r1 */
-
- cps #0x13 /* 进入SVC模式,允许其他中断再次进去 */
-
- push {lr} /* 保存SVC模式的lr寄存器 */
- ldr r2, =system_irqhandler /* 加载C语言中断处理函数到r2寄存器中*/
- blx r2 /* 运行C语言中断处理函数,带有一个参数,保存在R0寄存器中 */
- pop {lr} /* 执行完C语言中断服务函数,lr出栈 */
- cps #0x12 /* 进入IRQ模式 */
- pop {r0, r1}
- str r0, [r1, #0X10] /* 中断执行完成,写EOIR */
- pop {r0}
- msr spsr_cxsf, r0 /* 恢复spsr */
- pop {r0-r3, r12} /* r0-r3,r12出栈 */
- pop {lr} /* lr出栈 */
- subs pc, lr, #4 /* 将lr-4赋给pc */
复制代码
在裸机中断实验中,请问下老师 为什么说这句话注释是 “允许其他中断再次进去" , 这只是修改处理器模式,并没有修改I/F标志,我个人理解是最后一句话 subs pc, lr, #4 /* 将lr-4赋给pc */ 才是重新使能中断的,请老师分析下,谢谢
cps #0x13 /* 进入SVC模式,允许其他中断再次进去 */ |
|