中断处理程序
----中断处理程序ISR是在中断发生时被调用时用来处理中断的函数,在中断运行期间,不能
----执行有可能引起睡眠测操作,不能同用户空间交换数据,不能调用schedule函数,实现
----中断处理有一个原则,就是尽可能快处理并返回地,但是多数中断产生时要进行大量的
----耗时处理,为了使中断处理尽可能短并完成后续大量工作,linux引入了一种底半部机制,
----分为顶半部(top half)和底半部(buttomhalf)。
底半部机制
----Tasklet
----工作队列
Tasklet和下半部处理
----tasklet将任务延迟到安全时间执行,每个tasklet都和一个函数相关联,当tasklet运行时,
----该函数就被调用,并且tasklet可以调度自己。
Tasklet的实现
----定义一个处理函数:
----void tasklet_func(unsigned long);
----定义一个tasklet结构my_tasklet与tasklet_func(data)函数关联
----struct tasklet_struct my_tasklet;
----DECLARE_TASKLET(my_tasklet,tasklet_func,data);
----调度tasklet
----tasklet_schedule(&my_tasklet);
工作队列和下半部处理
----工作队列使用方法和tasklet非常相似
----定义一个工作队列:
----struct work_struct my_wq;
----定义一个处理函数
----void my_wq_func(struct work_struct *work);
----初始化工作队列并将其处理函数绑定
----INIT_WORK(&my_wq,my_wq_func);
----调度工作队列执行
----schedule_work(&my_wq);
Tasklet和工作队列的区别
----tasklet工作在中断上下文
----工作队列工作在进程上下文
----tasklet处理函数中不能睡眠
----工作队列中允许有睡眠