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操作系统自动完成,开发者不必太关心(如果是在裸板上开发就要自己实现这些了)。。
具体的函数实现在我的博客里,欢迎大家浏览。
- ARM 中断驱动程序的开发流程(以s3c2440开发板为例)
- S3C2440开发板之按键中断方式驱动程序
- 调试开发板的一般过程:以ARM为例
- ARM裸板程序的开发和编译(以点亮LED灯为例)
- 【SDK驱动开发1】中断的使用(以一个dma为例)
- 驱动程序的开发经验:中断与中断
- 开发板硬件调试的一般过程:以ARM为例
- ARM Linux中断分析(以s3c2410为例)
- Uboot的启动流程--以友善之臂tiny4412开发板为例
- 一款s3c2440开发板全功能ARM模拟器
- lmbench的使用方法(以SEP4020开发板为例)
- 建立以变更为核心的开发管理流程
- --建立以变更为核心的开发管理流程
- 建立以变更为核心的开发管理流程
- 一个以架构为中心的开发流程
- ARM开发板(S3C2440)上LED灯驱动及跑马灯的实现
- 应用QQ2440(s3c2440)ARM开发板驱动MMA7455加速度计的linux设备驱动编写
- 应用QQ2440(s3c2440)ARM开发板驱动MMA7455加速度计的linux设备驱动编写
- Flex屏蔽并自定义鼠标右键菜单(转载)
- Flex开源组件——FlexReport (转帖)
- linux kernel 模块
- CListCtrl 控件添加复选框
- pysnmp的安装
- ARM 中断驱动程序的开发流程(以s3c2440开发板为例)
- 已经解决MovieClip打印问题 (转帖)
- 从 MySQL 或 PostgreSQL 迁移到 DB2 Express-C
- PHP中判断数组是否为空的方法
- NYOJ 20 吝啬的国度 续
- NBUT 1189 Join the Lyrics Player(字符串处理)
- 防浪涌电路
- Hibernate学习笔记(四)
- MovieClip实现拖拽等移动位置的功能