Disabling all interrupts
#include <asm/system.h> void local_irq_save(unsigned long flags); /* save flags then disable local all */ void local_irq_disable(void); /* disable local all directly */ void local_irq_restore(unsigned long flags); void local_irq_enable(void); 底半部机制
tasklet
void my_tasklet_func(unsigned long); /*定义一个处理函数*/ /* 定义一个tasklet结构my_tasklet,并与my_tasklet_func(data)处理函数相关联 */ DECLARE_TASKLET(my_tasklet, my_tasklet_func, data); /* 在需要调度tasklet的时候引用一个tasklet_schedule()函数就能使系统在适当的时候进行调度运行 一般在top half即中断响应函数中调用 */ tasklet_schedule(&my_tasklet);
工作队列(workqueues)
与tasklet类似:
Tip: tasklet在中断上下文中执行,不可阻塞或睡眠;而workqueues由内核线程去执行,属进程上下文,可阻塞和睡眠。