预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

深入分析Tasklet机制一、tasklet使用Tasklet的使用比较简单,每个Tasklet结构体有一个函数指针,指向你自己定义的函数。当我们要使用tasklet,首先新定义一个tasklet_struct结构,并初始化好要执行函数指针,然后将它挂接到task_vec链表中,并触发一个软中断就可以等着被执行了。1.1.定义tasklet_struct结构Voidmy_tasklet_func(unsignedlong)DECLARE_TASKLET(my_tasklet.my_tasklet_func,data)代码DECLARE_TASKLET实现了定义名称为my_tasklet的tasklet并将其与my_tasklet_func这个函数绑定,而传入这个函数的参数为data。需要调度tasklet的时候引用一个tasklet_schedule()函数就能使系统在适当的时候进行调度,如下所示:1.2.调度taskletTasklet_schedule(&my_tasklet)此函数将定义后的tasklet挂接到cpu的tasklet_vec链表,具体是哪个cpu的tasklet_vec链表,是根据当前线程是运行在哪个cpu来决定的。此函数不仅会挂接tasklet,而且会引起一个软tasklet的软中断,即把tasklet对应的中断向量挂起(pend)。1.3.驱动模板voidxxx_do_tasklet(unsignedlong);DECLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0);voidxxx_do_tasklet(unsignedlong){……}irqreturn_txxx_interrupt(intirq,void*dev_id,structpt_regs*regs){……tasklet_schedule(&xxx_tasklet);……}int_initxxx_init(void){……result=request_irq(xxx_irq,xxx_interrupt,SA_INTERRUPT,”xxx”,NULL)……}void_exitxxx_exit(void){……free_irq(xxx_irq,xxx_irq_interrupt);……}二、tasklet函数详解2.1.tasklet_structtasklet对于中断处理特别有用:硬件中断必须尽快处理,但大部分的数据管理可以延后到以后安全的时间执行。tasklet以一个数据结构形式存在,使用前必须被初始化。初始化能够通过调用一个特定函数或者通过使用某些宏定义声明结构:#include<linux/interrupt.h>structtasklet_struct{structtasklet_struct*next;unsignedlongstate;atomic_tcount;void(*func)(unsignedlong);unsignedlongdata;};在这个结构体中,第一个成员代表链表中的下一个tasklet。第二个变量代表此刻tasklet的状态,一般为TASKLET_STATE_SCHED,表示此tasklet已被调度且正准备运行;此变量还可取TASKLET_STATE_RUN,表示正在运行,但只用在多处理器的情况下。count成员是一个引用计数器,只有当其值为0时候,tasklet才会被激活;否则被禁止,不能被执行。而接下来的func变量很明显是一个函数指针,它指向tasklet处理函数,这个处理函数的唯一参数为data。2.2.tasklet操作函数voidtasklet_init(structtasklet_struct*t,void(*func)(unsignedlong),unsignedlongdata);#defineDECLARE_TASKLET(name,func,data)\structtasklet_structname={NULL,0,ATOMIC_INIT(0),func,data}#defineDECLARE_TASKLET_DISABLED(name,func,data)\structtasklet_structname={NULL,0,ATOMIC_INIT(1),func,data}voidtasklet_disable(structtasklet_struct*t);/*函数暂时禁止给定的tasklet被tasklet_schedule调度,直到这个tasklet被再次被enable;若这个tasklet当前在运行,这个函数忙