Linux设备驱动-中断处理笔记
来源:互联网 发布:大班幼儿美工作品图片 编辑:程序博客网 时间:2024/05/16 16:17
为什么需要中断?
1)外设的处理速度一般慢于CPU
2)CPU不能一直等外部事件
所以设备必须有一种方法来通知CPU它的工作进度,这就是中断。
在Linux驱动程序中,为设备实现一个中断
步骤:
1)向内核注册中断
2)实现中断处理函数
中断注册
int request_irq(unsigned int irq, void (*handler)(int, void*, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id)
返回0表示成功,或者返回一个错误码
参数:
irq:中断号
handler:中断处理函数
flags:与中断管理有关的各种选项
devname:设备名
dev_id:共享中断时使用
在flags参数中,可以选择一些与中断管理有关的选项
如:IRQF_DISABLED(SA_INTERRUPT)
如果设置该位,表示是一个“快速”中断处理程序
如果没有,表示是一个“慢速”中断处理程序
IRQF_SHARED(SA_SHIRQ)
该位表示中断可以在设备间共享
快速中断不允许中断嵌套(不被打断)
慢速中断可以中断嵌套,其它类型的中断可以得到服务(默认)
共享中断
共享中断就是将不同的设备挂到同一个中断信号线上。
Linux对共享的支持主要是为PCI设备服务
共享中断也是通过request_irq函数来注册的,但有三个特别之处:
1)申请共享中断时,必须在flags参数中指定IRQF_SHARED位
2)dev_id参数必须是唯一的
为什么要唯一?
在释放中断时要void free_irq()不然内核不知道你要释放哪个设备(共享中断时有不只一个设备在用这个中断)
3)不能使用disable_irq(unsigned int irq)(这个函数是禁止中断的)
为什么?
如果使用了,共享中断信号线的设备同样无法使用中断,也就是无法正常工作了。
中断处理程序
中断处理程序是中断上下文件中运行的,所以它的行为受到某些限制:
1)不能向用户空间发送或者接受数据
2)不能使用可能引起阻塞的函数
3)不能使用可能引起调度的函数
中断函数实现流程:
释放中断
void free_irq(unsigned int irq, void *dev_id)
- Linux设备驱动-中断处理笔记
- Linux 设备驱动--- 中断处理
- 深入浅出 Linux设备驱动中断处理介绍
- Linux设备驱动编程之中断处理
- Linux设备驱动编程之中断处理
- Linux设备驱动编程之中断处理
- Linux设备驱动编程之中断处理
- 深入浅出 Linux设备驱动中断处理介绍
- 深入浅出 Linux设备驱动中断处理介绍
- 深入浅出 Linux设备驱动中断处理介绍
- 深入浅出 Linux设备驱动中断处理介绍
- Linux设备驱动编程之中断处理
- 深入浅出 Linux设备驱动中断处理介
- Linux设备驱动编程之中断处理
- Linux设备驱动编程中断处理
- Linux设备驱动中的中断处理
- linux设备驱动-按键中断实验笔记
- 字符设备驱动之笔记-中断处理过程情景分析
- STL auto_ptr智能指针简单分析
- Fortran 字符串变量(STRING)
- 深入浅出之正则表达式(一)
- 如何在用户停止操作一段时间后隐藏界面上的某些东东,比如遥控器按出的menu,一段时间不按遥控器就让menu消失
- 手机SIM卡的详细介绍
- Linux设备驱动-中断处理笔记
- 频繁打开数据库连接是否影响性能的疑惑
- CLR via c# 装箱与拆箱
- 解除苹果的appleID绑定的信用卡
- Android 程序自动更新
- Android动画及图片的缩放和旋转
- 未能从程序 集'Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage,Version=9.0.0.0,Culture=neutral
- JS MVC 用例子来说明他的好处
- ASP.NET连接数据库并获取数据