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函数