一、什么是中断
中断分两种:
1)中断,又叫外部中断或异步中断,它的产生是由于外设向处理器发出中断请求。其中外部中断也有两种,这是由配置寄存器设定的:普通中断请求(IRQ)和快速中断请求(FIQ)。一般地,linux下很少使用快速中断请求。
2)异常,又叫内部中断或同步中断,它的产生是由于处理器执行指令出错。
在以下的内容我是要介绍由于外部设备产生的中断。
这里我还有两个名词要说清楚
1)中断请求线:在后面也叫中断号,每个中断都会通过一个唯一的数值来标识,而这个值就称做中断请求线
2)在2440芯片中,有些中断是需要共享一个中断寄存器中的一位,如EINT4——EINT7,它们是共享寄存器SRCPEND的第4位。具体可以查看芯片手册。
二、什么是中断处理函数
在相应一个中断是,内核会执行该信号对应的一个函数,该函数就叫做该中断对应的中断处理函数。一般来说,中断的优先级是最高的,一但接收到中断,内核就会调用对应的中断处理函数。
中断处理函数运行在中断上下文中。中断上下文与内核上下文有一点区别:
内核上下文是指应用层调用系统调用陷入内核执行,内核代表陷入的进程执行操作。函数中可以通过current查看当前进程(即应用层的进程)的信息,并且可以睡眠。
中断上下文中,不能通过current查看调用它的应用层进程的信息,同时,处于中断上下文时,不能睡眠。
一、从硬件角度看中断
中断的产生到处理器获得中断这段过程中,还要通过中断处理器来筛选信号。
先温习一下S3C2440芯片手册的知识:中断是如何产生的,中断处理器本身如何处理中断。先看一下一幅经典的图,这是介绍中断控制器的工作流程:
从硬件上的分类,有两种不同的中断类型:
1)自己占有SORCPND寄存器的一位(without sub-register)。
2)几个中断共同享用SRCPND寄存器的一位(with sub-register)。
其实两种都差不多,只是多了两步的检测。我以自己占用一位的中断来举例,如EINT1,在我的开发板,EINT1上接了一个按键。
1)当我按下按键产生电平变化,传到S3C2440的中断控制器上(即将要进入上面图的流程图)。
2)首先,信号要经过寄存器SRCPND,SRCPND是用来配置当前的处理器要接收什么中断,如果该寄存器配置成接收EINT1中断(对应位置一),则允许继续下一步。
3)然后,信号经过寄存器MASK,这是用来设置当前系统需要屏蔽的中断。注意,这里的屏蔽跟上一个寄存器的不接收中断是不一样的。这里的屏蔽是指,中断是接受了,但是由于某种原因,先暂时不屏蔽产生的中断。
4)通过INTPND寄存器,查看当前是否有相同的中断已经被请求(如果是,INTPND对应位置一)。
5)如果没有相同的中断在请求,中断处理器才会把这个信号传给处理器,这时处理器才会知道有EINT0的中断真正来了,要对信号进行处理了。
注:如果设定了EINT0是快速中断模式(FIQ),中断通过SRCPND寄存器后就会通过MODE寄存器的判断,确定是FIQ后,中断控制器优先将该中断传给CPU处理。