在设备驱动的中断处理中经常会用到tasklet,在前面稍微看了下linux的软中断后,tasklet就很容易理解了。Tasklet也要用到软中断,而tasklet的用法和定时器的用法很相似。
同样的在main.c中,
start_kernel-->softirq_init
先给出tasklet的结构体定义:
这样在softirq_init函数中,首先初始化tasklet_vec
软中断的执行还是由ksoftirqd内核线程来处理。
下面看下tasklet的初始化:
Tasklet的调度:
这里先将刚才初始化的tasklet_struct加入这个tasklet_vec向量表中
这里调用raise_softirq_irqoff(TASKLET_SOFTIRQ);
来触发软中断。
那么,前面的中断服务程序是tasklet_action就开始执行了:
遍历tasklet_vec向量表,调用每个tasklet中在注册时的t->func(t->data);函数。
这样,tasklet就可以用于中断的顶半部和底半部。
在中断处理的顶半部,调用tasklet_schedule函数
Tasklet关联的tasklet处理函数就是中断的底半部处理。