![](http://blogimg.chinaunix.net/blog/upfile2/080716092502.jpg)
![](http://blogimg.chinaunix.net/blog/upfile2/080716095838.jpg)
![](http://blogimg.chinaunix.net/blog/upfile2/080716100714.jpg)
- 定义一个处理函数void my_tasklet_func(unsigned long);
- DECLARE_TASKLET(my_tasklet,my_tasklet_func,data); /* 定义一个tasklet结构my_tasklet,与my_tasklet_func(data)函数相关联,相当于 DECLARE_TASK_QUEUE() */
- tasklet_schedule(&my_tasklet); /* 登记my_tasklet,允许系统在适当的时候进行调度运行,相当于 queue_task(&my_task,&tq_immediate)和mark_bh(IMMEDIATE_BH) */
另外还提到task queue task我就列出了看杨博士的文章吧
下面我们用键盘的实例说一下建立tasklet的过程
首先必须在驱动中声明一个全局的tasklet结构变量,这样是为了在中断处理中能够获得这个全局的tasklet结构变量。
static struct tasklet_struct key_tasklet;
我们还需要一个结构保存键值
struct IO_key {
unsigned long prevjiffies ;
int count;
};
static struct IO_key key;
然后我们需要一个在后半部的处理程序,比如键盘为例
void key_tasklet(unsigned long arg)
{
struct IO_key *data = (struct IO_key *)arg;
unsigned long j=0;
printk("/n**************key_tasklet_start*****************/n");
j = jiffies;
printk("time:%08lx delta:%3li inirq:%i pid:%3i cpu:%i command:%s/n",
j, j - data->prevjiffies, in_interrupt() ? 1 : 0,
current->pid, smp_processor_id(), current->comm);
printk("/n**************key_tasklet_end*****************/n");
}
有了上面这些内容后,我们就可以建立自己的tasklet了,使用这个函数向内核注册登记,注意2.6的内核使用tasklet_init()而上面我们学习的是2.4内核的相关内容,二者完全一样原理
tasklet_init(&keytask , key_tasklet , (unsigned long)&key);
这样我们建立了键盘的后半部处理程序,可以用来转译键码,而前半部中断是为了查找到具体哪个键产生了中断。这样就把比较费时的处理工作由tasklet来完成了。
From: http://blogold.chinaunix.net/u2/64681/showart_1083131.html