1.什么是中断?
答:中断是CPU保证并发程序的一种机制。它使得CPU在执行程序的时候能够响应异常的情况发生。
其实,在CPU在运行的过程中,如何知道各类外设发生了某些没预期的事,比如说串口接受到了数据、USB接口中插入了设备、按下了某个按键。有两种方法,一个是前面所说的中断、另一个就是轮询方式。(就是不断的while循环查询)。从某种程度上说,这两种方式其实是一样的。前者是把查询的时间跨度缩小到每条指令执行结束后,即当某事件发生时,硬件会设置某个寄存器;CPU在每执行完一条指令时,通过硬件查看这个寄存器,来“查询”是否有关注的事件发生。
2.s3c2440基本的中断处理流程是什么?
答:如下图所示。
我是这样简单理解的:s3c2440有两种类型的中断源。子中断源和普通中断源。类型相似的子中断源若有中断请求发生,会聚合成一个“大的”普通中断源(不知道这样形容,贴切不)。当然这是在子中断源没有被屏蔽的条件下。这个子中断源的中断请求要想成功,还是挺困难的,得经过两道坎。首先,子中断源屏蔽寄存器不能屏蔽它,然后中断屏蔽寄存器也不能屏蔽它才有可能得到CPU的“眷顾”(当然,它还得和一大批同时请
求的其他请求源竞争)。 普通的中断源相当于“妃子”,只要有请求,而且优先级较高就能得到CPU的“青睐”。还有一个皇后级别的中断源,叫做快速中断源。她比较牛X,只要请求,CPU就会“临幸”。(好似宫斗剧啊)。
3.当发生中断后,具体我们该如何编程呢?
答:当一个异常发生时,这时ARM 的CPU将自动完成如下事情(要记住,是自动):
(1)、lr寄存器保存目前指令的下一条指令地址。一般是(PC+4或PC+8)
(2)、将CPSR的值复制到SPSR。
(3)、将CPSR的工作模式位设置为异常对应的工作模式。
(4)、转去执行此异常对应的向量表中的相应指令(并不只是中断处理函数)。
对于我们来说,我们需要在异常向量表对应的地址处完成以下事情:
(1)、保存运行的环境。此处所说的运行环境指的是前一模式中的运行环境。虽然这是已经进入到异常模式,但是由于异常模式和普通的模式都共享一些寄存器,此处异常模式下的的这些寄存器还保存的上前一模式中的数据,所以得保存至堆栈。
(2)、进入ISP函数。即自己所写的中断处理函数,处理中断。
(3)、在中断处理函数中,要判断是哪个中断源发出的请求(如果中断源很明确,则不用判断)、正式处理中断请求(接受数据、发送数据、点亮灯等等)、最后别忘了要清除中断源。
(4)、中断返回,恢复保存的运行环境。
- 1
- 2
- 3
- 4
- 5
- 6
4.中断向量表是什么?
答:中断向量表就是发生中断后,CPU就会根据中断向量表找到断向量入口地址,在此地址上继续执行。以前上课的时候,觉得好神秘,我去,硬件方式实现的中断向量表。现在看看,其实也不是很难(至少ARM9是这样)。简单来说,中断向量表也不是一个真正的表,它只是事先规定好了,如果发生这个中断就去这个地址上继续执行。看起来像是映射了一张表,可以把它看成一张逻辑的表。 发生中断后,CPU就去实现规定好的地址上继续执行。所以呢,你就必须在这个地址上写上你的中断处理函数。如果这个地址上什么也没有,那么程序就要死翘翘了。