tasklet是一种软中断,是基于softirq的基础演变而来的,但是由于资源的限制,softirq是在内核里面预定义好的,无法改变其种类,若要改变的话,就要修改内核代码,这对于驱动开发来说不是很合适.因此基于softirq发展出的tasklet来动态的改变中断的种类,这些中断使用链表连接起来,一旦发生了TASKLET_SOFTIRQ中断(tasklet对应的软中断类型),就按照链表的顺序依次全部执行,执行完毕就断开链表.
使用tasklet方法
//首先调用tasklet_init函数,对tasklet_struct 结构体进行初始化
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data)
{
t->next = NULL;
t->state = 0;
atomic_set(&t->count, 0);
t->func = func;
t->data = data;
}
struct tasklet_struct
{
struct tasklet_struct *next; //链表指向的下一个目标
unsigned long state;
atomic_t count;
void (*func)(unsigned long); //中断函数
unsigned long data; //传递给中断函数的参数
};
//然后触发tasklet中断,引起调度
static inline void tasklet_schedule(struct tasklet_struct *t)
{
if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
__tasklet_s