tasklet使用方法

tasklet的概念我这里就不多讲了,因为网上的文章很多,我这里只介绍怎么在我们的驱动程序中使用tasklet提供的接口函数。一般,从定义到最后注销,一共有4步,下面我们分别介绍这4个接口函数。

静态定义tasklet

static void my_tasklet_func(unsigned long data);

DECLARE_TASKLET_DISABLED(tasklet, my_tasklet_func, 0);

其中

#define DECLARE_TASKLET_DISABLED(name, func, data) \ 
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }

当然也可以像下面这么定义,

#define DECLARE_TASKLET(name, func, data) \ 
struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }

这两个宏都可以静态定义一个struct tasklet_struct的变量,只不过初始化后的tasklet一个是处于eable状态,一个处于disable状态的。当然,也可以动态分配tasklet,然后调用tasklet_init来初始化该tasklet。


使能tasklet并传递参数

tasklet_enable(&tasklet); //因为定义的时候使用的是DECLARE_TASKLET_DISABLED,所以需要在初始化函数(可以是.probe)时使能它
tasklet.data = (unsigned long)my_data; //如果需要在调用my_tasklet_func时,传递参数,可以这么做

调度tasklet

tasklet_schedule(&tasklet);  //这个就是调度我们的tasklet(可以在中断handler,也就是top half中调用)

注销掉tasklet

tasklet_disable(&tasklet);
tasklet_kill(&tasklet);

一般就在驱动的.remove函数
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章