源代碼分析與原理部分參見前面的文章linux中斷延遲之tasklet,這裡我們看看他的使用,和前面介紹的工作隊列、等待隊列等相同,聲明采用兩種方法,我們在init函數中直接采用tasklet_schedule(&my_tasklet);調度,內核中的實現很簡單:
void __tasklet_schedule(struct tasklet_struct *t)
{
unsigned long flags;
local_irq_save(flags);
t->next = NULL;
*__get_cpu_var(tasklet_vec).tail = t;
__get_cpu_var(tasklet_vec).tail = &(t->next);
raise_softirq_irqoff(TASKLET_SOFTIRQ);
local_irq_restore(flags);
}
上面幾個函數在前面的文章linux軟中斷中已經介紹過了,直接看使用
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
static void tasklet_func(unsigned long value)
{
printk("This is tasklet function!\n");
}
/*用靜態方式聲明並定義一個tasklet,動態方式一樣*/
DECLARE_TASKLET(my_tasklet,&tasklet_func,0);
static __init int my_tasklet_init(void)
{
/*直接調度我們的函數*/
tasklet_schedule(&my_tasklet);
return 0;
}
static void my_tasklet_exit(void)
{
}
module_init(my_tasklet_init);
module_exit(my_tasklet_exit);
運行結果: