基于S5PV210的中断和外部按键中断
基于S5PV210的中断和外部按键中断
--参考朱有鹏ARM裸机课堂
1、什么是中断?
中断的目的就是为了处理更加重要的事情和任务。
并行的处理事情,单核的CPU在微观上是无法实现并行的,只能实现宏观的并行。
2、SOC对中断的实现机制:异常向量表;
为什么CPU可以实现中断?因为我们机器的执行都是按照地址的顺序执行下去。
但是为什么CPU可以实现中断?主要是因为CPU可以执行间接寻址的功能,
也就是可以通过指针的方式跳转到别的地方继续执行。
异常向量表是CPU中某些特定地址的特定定义,当中断发生的时候,中断想办法
通知CPU去处理中断,怎么做到的,就是要靠异常向量表。
3、异常和中断的区别和联系
(1)对于SOC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常都是属于异常
(2)异常的定义就是突发事件,打算了CPU的正常的工作,CPU就需要通过异常向量表中去执行程序。
(3)中断是异常的一种,异常包含于中断
4、异常向量表的编程处理
(1)S5PV210的异常向量表可以改变,以适应于操作系统的需求,
但是系统在刚刚启动的时候,此时DRAM尚未初始化,程序都是在SRAM中运行。
210在IRAM中设置了异常向量表,供暂时使用。
(2)查找210的IROM application NOTE 文档中IRAM的地址分配,可知,
IRAM中的异常向量表其实地址是0xD0037400 知道异常向量表的起始地址后,
各个异常对应的入口地址就知道了,因为他们的地址是靠在一起的。
5、函数名的实质是函数的首地址
(1)函数名在C语言中的理解方式和变量名其实没有区别。
编译器就把这个函数的函数体对应的代码段和这个函数的函数名对应起来,
当我们使用这个函数名的时候,实际上就是可以调用这个函数体。
为什么不直接把函数体绑定在需要的异常入口地址处?
因为异常的入口的地方不好规定一块固定大小的值,只能提供一个4字节的
位置放置地址比较合适。
(2)函数名就是这个函数的函数指针。
(3)当我们将异常处理程序的首地址和异常向量表绑定好了之后,
异常的处理的初步阶段就完成了。
6、为什么中断处理要在汇编中进行
(1)中断处理要注意保护现场(中断一般是从SVC模式来的,则保存SVC模式下的必要寄存器的值)
和恢复现场(中断处理完成后,准备返回SVC模式前要将保存在SVC模式下的必要寄存器的值
恢复回去,不然到了SVC模式后寄存器的值就乱了,SVC模式下面原来进行的常规任务也会别你搞坏了)
(2)保存现场包括:第一:在进入中断时,设置IRQ栈,第二,保存LR,保存R0-R12
(3)为什么要保存LR寄存器?要考虑中断返回的问题。
中断返回时候最关键的两个寄存器PC和CPSR。
在我们进入IRQ模式时候,应该将SVC模式下面的下一句指令的地址(也就是中断返回地址)
和CPSR保存起来,将来恢复的时候才可以将中断返回地址给PC,将保存的SPSR返回去CPSR。
(4)中断返回的地址就是保存在LR寄存器中的,而CPSR(在发生中断的时候)会自动的保存在IRQ模式下面的SPSR