Linux 驱动开发基础---中断下半部处理---中断线程化处理
作者:
也许
,
2022-05-15 20:18:34
,
所有人可见
,
阅读 389
中断线程化处理引入
复杂、耗时的事情,尽量使用内核线程来处理。上节视频介绍的工作队列用起来挺简单,但是它有一个缺点:工作队列中有
多个work,前一个work没处理完会影响后面的work。解决方法有很多种,比如干脆自己创建一个内核线程,不跟别的work凑
在一块了。
对于中断处理,还有另一种方法:threadedirq,线程化的中断处理。中断的处理仍然可以认为分为上半部、下半部。上半
部用来处理紧急的事情,下半部用一个内核线程来处理,这个内核线程专用于这个中断。
函数
request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn,unsigned long flags,
const char *name, void *dev);
作用:将中断线程化,中断将作为内核线程运行
参数:
irq 中断号,所申请的中断向量
handler 中断处理函数,在驱动中一般这个参数是NULL,为NULL时使用默认的处理,这个相当于中断的上半段
thread_fn 中断发生时,如果handler为NULL,就直接将thread_fn扔到内核线程中去执行
flags 指定中断属性、中断触发方式(一般用宏定义表示)等,定义在linux/interrupt.h中
name 指定中断名字,用命令cat /proc/interrupts可查看系统中断申请与使用情况
dev 传入中断处理程序的参数,可以为NULL,但在注册共享中断时,此参数不能为NULL。该参数可作为共享中
断时的中断区别参数,还可以把其传给一个结构体变量,用于保存一个设备的信息,使中断处理函数可以获得该设备的信息
编程
probe 函数中将request_irq() 换成 request_threaded_irq()