tasklet(小任务)
一个使用tasklet的中断程序首先会通过执行中断处理程序来快速完成上半部分的工作,接着通过调度tasklet使得下半部分的工作得以完成,但是下半部分何时执行属于内核的工作。
tasklet定义在linux/interrupt.h中,实现在kernel/softirq.c中。
struct tasklet_struct {
struct tasklet_struct *next;
unsigned long state;
atomic_t count;
void (*func)(unsigned long);
unsigned long data;
};
同一时刻只能有一个同类的tasklet底半部在执行,即使是多CPU情况。
(访问共享资源不用加锁)。
函数
struct tasklet_struct mytasklet;
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data);
tasklet_schedule(&mytasklet); //掉用底半部,注意,这不是立即调用,是调度,意味着tasklet底半部会在顶半部执行完成后才会执行。
参考: