在驱动中经常会以中断的方式来处理数据,以前总是搞的不太清楚,今天在这里和S3C2410的中断处理来做个了结。ARM的CPU中一般都带有一个中断控制器,S3C2410也不例外。S3C2410中断控制器可以支持56个设备,其中包含内部设备和外部设备。内部设备有UART0,LCD,USB等;外部设备是EINT0/EINT1/EINT2/EINT3,这几个外部中断是各自的占有一条外部中断线;EINT4~7,4~7号外部中断共用一条数据线;EINT8~EINT23共用一条数据先,外部中断是通过GPIO复选功能来实现的。
在中断处理中重要的几个寄存器:SRCPND(SOURCE PENDING REGISTER),INTPND(INTERRUPT PENDING REGISTER),INTMSK(INTERRUPT MASK REGISTER)。
SRCPND是中断源引脚寄存器,在一个中断异常处理流程中,中断信号传进中断异常处理模块后首先遇到的就是SRCPND,这个寄存器的作用是标志出哪个中断请求被触发。SRCPND的有效位是32位。
INTPND寄存器和SRCPND是相同的位设置,但是他们在中断异常处理中却扮演着不同的角色,SRCPND是中断处理经过的第一个寄存器,而INTPND是中断处理经历的最后一个寄存器。它的每一位对应着一个中断请求,若该位为1则中断请求被触发。它和SRCPND的主要区别是:在同一时刻可以有多个中断被触发,因此在SRCPND寄存器中可以同时有多个bit位被置1;然而INTPND则不同,它在同一个时刻只能有1个位被置1。做个总结:SRCPND说明了有什么中断被触发了,INTPND说明了CPU即将或已经在对某一个中断进行处理。
特别注意,每当一个中断处理结束后,我们必须手动的把SRCPND/SUBSRCPND,INTPND三个寄存器中与该中断相应的位由1变成0。对于INTPND的操作很特别,它的特别之处在于将该寄存器某一个位又1变成0时,不是往该位写0,而是往该位写1。例如SRCPND=0x00000003, INTPND=0x00000001,该值说明当前0号中断和1号中断被触发,但是当前正在被处理的是0号中断,处理完毕后就应该将0号中断的位置清理掉,这样设置INTPND和SRCPND寄存器:
SRCPND = 0x00000002 //位0被置为0
INTPND = 0x00000001 //位0被置为0(方法是往该位写入1)
INTMSK此处理器为中断屏蔽寄存器,有效长度为32bit,它们的作用是决定该位相应的中断请求是否被处理。若某位被设置为1,则该位相对应的中断产生后将被忽略(CPU不处理该中断请求),设置为0则对其进行处理。在S3C2410中初始化的数值是0xFFFFFFFF就是说在初始状态所有的中断是被屏蔽掉的。如果我们要打开一个中断服务可以这样:writel(readl(INTMSK)&(~0x01), INTMSK), //使能EINT0。以上讲的都是对2410主中断源的分析。
阅读(2749) | 评论(0) | 转发(0) |