本文档只介绍中断编程所需的函数及应用,中断完整处理流程应参考文档《linux中断处理流程》,可参考文档《linux内核对中断的处理方式》对中断初步了解。

本文档基于3.14内核。

一. 申请和释放中断

一般在设备驱动模块的初始化中申请中断,在模块卸载函数中释放中断。

// linux/irqreturn.h
/**
* enum irqreturn
* @IRQ_NONE interrupt was not from this device
* @IRQ_HANDLED interrupt was handled by this device
* @IRQ_WAKE_THREAD handler requests to wake the handler thread
*/
enum irqreturn {
IRQ_NONE = ( << ),
IRQ_HANDLED = ( << ),
IRQ_WAKE_THREAD = ( << ),
}; typedef enum irqreturn irqreturn_t;
typedef irqreturn_t (*irq_handler_t)(int irq, void *dev_id);
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev_id);

irq要申请的硬件中断号。

handler是向系统登记的中断处理函数(顶半部),是一个回调函数,中断发生后,系统调用这个函数,dev_id参数将传递给handler。

irqflags是中断处理的属性,可以指定中断的触发方式以及处理方式。在触发方式方面,可以是IRQF_TRIGGER_RISING、IRQF_TRIGGER_FALLING、IRQF_TRIGGER_HIGH、IRQF_TRIGGER_LOW等。在处理方式方面,若设置了IRQF_DISABLED,表明中断处理程序是快速处理程序,快速成立程序被调用时屏蔽所有中断,慢速处理程序调用时不会屏蔽其他设备的驱动;若设置了IRQF_SHARED,则表示多个设备共享中断,dev_id在中断共享时会用到,一般设置为这个设备的结构体或者NULL。

name是中断名,在/proc/interrupts中显示。

返回值0表示成功,返回-EINVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。

void free_irq(unsigned int irq, void *dev_id);

二. 使能和屏蔽中断

1. 屏蔽一个中断源irq

extern void disable_irq_nosync(unsigned int irq);
extern void disable_irq(unsigned int irq);
extern void disable_percpu_irq(unsigned int irq);
extern void enable_irq(unsigned int irq);
extern void enable_percpu_irq(unsigned int irq, unsigned int type);

disable_irq_nosync()与disable_irq()的区别在于前者立即返回,而后者等待目前的中断处理完成。由于disable_irq()会等待指定的中断被处理完,因此如果在n号中断的顶半部调用disable_irq(n),会引起系统的死锁,在这种情况下只能调用disable_irq_nosync(n)。

2. 屏蔽本CPU上所有中断

#define local_irq_enable()
#define local_irq_disable()
#define local_irq_save(flags)
#define local_irq_restore(flags)

flags为unsigned long类型,被直接传递,而不是通过指针。

3. 中断底半部的屏蔽使能

void local_bh_disable(void);
void local_bh_enable(void);

禁止和使能软中断和tasklet底半部机制的函数。

三. 中断底半部

中断底半部机制有三种,软中断、tasklet(小任务)和workqueue(工作队列)。一般不推荐使用软中断。

参考:

1. linux内核对中断的处理方式

2. linux中断处理流程

3. 设备驱动开发详解 宋宝华

4. 工作队列workqueue应用

5. 小任务tasklet应用

6. 中断函数

最新文章

  1. python之路——面向对象(基础篇)
  2. leetcode-Excel Sheet Column Title
  3. spring security方法一 自定义数据库表结构
  4. [WCF实践]1.WCF使用net.tcp寄宿到IIS中
  5. Verilog学习笔记基本语法篇(十)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 常用系统函数
  6. 在windows 下使用git
  7. js 返回上一页
  8. ProgressBar及其子类
  9. 理解reserve与resize
  10. Python冒泡排序
  11. 5.4 RegExp类型
  12. 汇总一些知名的 JavaScript 开发开源项目
  13. ajax异步调用遇到的问题
  14. Spring Cloud 学习记录
  15. Dijkstra双栈算术表达式求值
  16. android 工具大集合
  17. [DL] *Deep Learning for Industry - Wang Yi
  18. codevs1048石子归并
  19. JAVA 从头开始&lt;四&gt;
  20. Cookie &amp;&amp; Session之验证实例

热门文章

  1. HDUOJ--------(1312)Red and Black
  2. Google官方下拉刷新组件---SwipeRefreshLayout
  3. iOS开发 - 用AFNetworking实现https单向验证,双向验证
  4. 【Linux】目录权限与文件权限
  5. .net/c# RabbitMQ 连接断开处理-断线重连(转载)
  6. python学习笔记——multiprocessing 多进程组件 进程池Pool
  7. jpa 批量插入
  8. Latex 转 word 技法大全
  9. RTB竞价中的cookie mapping技术
  10. 自己写的一个操作Mysql的简单的实例