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