ARM 中断驱动程序的开发流程(以s3c2440开发板为例)

来源:互联网 发布:淘宝食品售后服务方案 编辑:程序博客网 时间:2024/06/11 21:08

为便于管理中断和节约CPU管脚,在cpu与中断源之间都会有中断控制器,一般的ARM芯片内部都集成了片上中断控制器。

以s3c2440开发板的按键中断为例来说明ARM中断的开发过程。

当一个设备产生中断后,操作系统处理流程如下:

1、保护现场

2、通过中断控制寄存器获取产生中断的设备

3、找到设备的处理程序

4、调用设备的处理程序

5、返回中断

下面就按照这五步来详细说明开发者每一步中要做什么。

1、保护现场

当设备产生中断后,CPU要错的第一件事就是保护现场,具体说就是保护当前程序的状态以及中断返回的地址,不过这部分工作都是有Linux操作系统自动完成,开发者不必太关心(如果是在裸板上开发就要自己实现这些了)。

2、通过中断控制寄存器获取产生中断的设备

一个CPU要处理N个中断源,因此当有中断产生后必须要确定产生中断的设备,才能调用正确的中断处理程序,中断控制器的SRCPND寄存器的每一个bit位对应一个中断源,例如当管脚EINT0/GPF0上收到中断信号后SRCPND寄存器的相应位就会置1,这样CPU就能确定请求中断的设备号来自哪个管脚上(这部分工作也是由操作系统负责完成,开发者不必关心,但如果一个管脚下面有多个设备,则开发者需要采取其它办法来进一步确定是哪个设备)。

3、找到设备的处理程序

在Linux的内核文件irqs.h中有许多中断号的宏定义,这些宏定义将中断控制器的物理引脚与中断号建立了联系,例如管脚EINT0/GPF0的中断号为IRQ_EINT0,因此我们只需要在程序中注册了中断号对应的中断处理程序就会在该引脚发生中断的时候自动执行改处理程序,为便于查找中断号对应的中断处理程序,系统建立了一份专门的表叫irq_desc[ ],他是一个全局数组,定义在irq.h中,表的每一项是包含有该中断的处理函数指针和其他一些中断属性的结构体,如我们注册中断号为IRQ_EINT0的中断:request_irq(IRQ_EINT0,key_irq_isr, IRQF_DISABLED, "key1irq", NULL);当管脚EINT0/GPF0上产生了中断信号,就会找到key_irq_isr()中断处理函数。

4、调用设备的处理程序

现在才正式进入中断处理程序来处理要做的事,中断处理函数key_irq_isr()往往是为了满足中断注册函数的要求而作为一个中间函数存在的,它里面往往会调用真正的中断处理函数。

5、返回中断

程序返回到原来的程序中继续执行,这一步主要完成中断现场的恢复,不过这部分工作都是有Linux操作系统自动完成,开发者不必太关心(如果是在裸板上开发就要自己实现这些了)。

具体的函数实现在我的博客里,欢迎大家浏览。

原创粉丝点击