假设外设为物理按键,需要连接到支持中断功能的对应的GPIO上。
CPU型号为:三星的S5PV210
本文所描述的中断控制流程适用性广泛,因为主流CPU的中断设计原理是相通的,只有细节的差异。
第一部分:按键外设对应中断功能的配置
1、按键对应的GPIO模式设置:设置为EXT_INT模式
2、该外设对应的中断触发模式设置:电平或边沿触发
3、该外设中断Mask和Pend寄存器位设置
4、编写该外设中断对应的ISR中断处理函数程序
第二部分:CPU内部响应中断的配置
Part1:前期准备工作
1、初始化系统异常控制器函数system_init_exception()
功能如下:
绑定异常向量表对应的中断服务函数;
关闭所有中断使能;
选择中断类型为IRQ;
清空中断向量控制地址寄存器VICxADDR
2、绑定写好的中断处理函数程序ISR到中断控制器对应的VICnVECTADDR寄存器
3、使能对应中断向量编号的中断源,即外设按键对应的中断源编号
Part2:外部按键产生中断后,CPU响应该中断
1、CPU读取异常向量表信息,并跳转到IRQ函数的入口地址
2、先进行程序现场保护(在Start.s完成),然后跳转到irq_handler()函数,
3、该irq_handler()函数功能用于判断具体哪个中断向量寄存器VIC发生中断,并调用对应的外设按键对应的ISR中断处理函数
4、ISR函数执行完毕后,程序现场恢复(在Start.s完成),并返回到主函数继续执行后续的程序。
// 在这个汇编函数中,用来做中断模式下的现场保护和恢复,并且调用真正的中断处理程序
IRQ_handle:
// 设置IRQ模式下的栈
ldr sp, =IRQ_STACK
// 保存LR
// 因为ARM有流水线,所以PC的值会比真正执行的代码+8,
sub lr, lr, #4
// 保存r0-r12和lr到irq模式下的栈上面
stmfd sp!, {r0-r12, lr}
// 在此调用真正的isr来处理中断
bl irq_handler
// 处理完成开始恢复现场,其实就是做中断返回,关键是将r0-r12,pc,cpsr一起回复
ldmfd sp!, {r0-r12, pc}^