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

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