参考:
《Linux内核设计与实现》
http://blog.csdn.net/fontlose/article/details/8279113
http://blog.chinaunix.net/uid-27212029-id-3386692.html
tasklet是中断处理下半部分最常用的一种方法,驱动程序一般先申请中断,在中断处理函数内完成中断上半部分的工作后调用tasklet。tasklet有如下特点:
6.每个cpu拥有一个tasklet_vec链表,具体是哪个cpu的tasklet_vec链表,是根据当前线程是运行在哪个cpu来决定的。
tasklet是驱动程序实现可延迟函数的首选方法,tasklet建立在HI_SOFTIRT和TASKLET_SOFTIRQ两个软中断上。
原理
tasklet和高优先级的tasklet分别存放在tasklet_vec和tasklet_hi_vec数组中,二者都包含类型为tasklet_head的
NR_CPUS个元素,每个元素都是指向tasklet描述符链表的指针。
执行过程
HI_SOFTIRQ软中断相关的软中断函数是tasklet_hi_action(),而与TASKLET_SOFTIRQ相关的函数是tasklet_action()
1.禁止本地中断
2.获得本地CPU的逻辑号n
3.把tasklet_vec[n]或tasklet_hi_vec[n]所指向的链表的地址存入局部变量list
4.把tasklet_vec[n]或tasklet_hi_vec[n]的值赋为NULL,因此已调度的tasklet描述符链表被清空
5.打开本地中断
6.对于list所指向的每个tasklet描述符
a.在多处理器系统上,检查tasklet的TASKLET_STATE_RUN标志。
if标志被设置,list重新插入结构数组,并激活TASKLET_SOFTIRQ或HI_SOFTIRQ软中断,这个tasklet
被延迟
else 设置TASKLET_STATE_RUN标志,以便tasklet不能在其他CPU上运行
b.通过查看tasklet描述符的count字段,看tasklet是否被禁止。如果是清TASKLET_STATE_RUN标志,把
list重新插入结构数组,并激活相应的软中断。
c.如果tasklet被激活,清TASKLET_STATE_SCHED标志,并执行tasklet函数
编写一个设备驱动程序的步骤
1.分配一个新的tasklet_struct数据结构,并用tasklet_init()初始化它;
2.实现tasklet函数
3.禁止或使能tasklet
tasklet结构体
tasklet的定义
tasklet的调用过程
原文地址:http://blog.csdn.net/hustyangju/article/details/40350145