首页 > 代码库 > linux中断底半部机制

linux中断底半部机制

中断处理程序

----中断处理程序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处理函数中不能睡眠

----工作队列中允许有睡眠

linux中断底半部机制