tasklet 是利用软中断来实现的另外一种下半部机制,在软中断和 tasklet 之间,建议大家使
用 tasklet。
在前面中断的基础上实现:
1.定义结构体变量:
struct tasklet_struct tasklet;
2.在中断初始化之后,初始化 tasklet:
tasklet_init(要初始化的 tasklet,
tasklet 的处理函数,
要传递给 func 函数的参数);
3.在中断上半部执行tasklet_schedule:
tasklet_schedule(&dev->irqkey[0].tasklet(要调度的 tasklet));
4.调用key_tasklet回调函数,执行中断下半部
static void key_tasklet(unsigned long data)
{
struct imx6uirq_dev *dev = (struct imx6uirq_dev*)data;
dev->timer.data = data; //定时器参数
mod_timer(&dev->timer, jiffies + msecs_to_jiffies(20)); /* 20ms定时 */
}
5.参考实例
tasklet 使用示例
/* 定义 taselet */
struct tasklet_struct testtasklet;
/* tasklet 处理函数 */
void testtasklet_func(unsigned long data)
{
/* tasklet 具体处理内容 */
}
/* 中断处理函数 */
irqreturn_t test_handler(int irq, void *dev_id)
{
......
/* 调度 tasklet */
tasklet_schedule(&testtasklet);
......
}
/* 驱动入口函数 */
static int __init xxxx_init(void)
{
......
/* 初始化 tasklet */
tasklet_init(&testtasklet, testtasklet_func, data);
/* 注册中断处理函数 */
request_irq(xxx_irq, test_handler, 0, "xxx", &xxx_dev);
......
}