linux中断底半部机制

2019-07-13 08:58发布

中断处理程序 ----中断处理程序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处理函数中不能睡眠 ----工作队列中允许有睡眠