1.应用场景
在中断中处理太多的操作是非常危险的,对中断的及时响应有很大的影响,在linux中我们经常会用到,来处理中断需要响应的操作。
2.使用方式
程序说明:
首先我们看probe中的程序,在linux驱动中首先执行的就是probe函数( **ili210x_i2c_probe**)。
①.初始化工作队列
先执行INIT_DELAYED_WORK的宏定义,将自己定义的结构体struct ili210x中添加一个struct delayed_work类型的变量,为dwork成员。并将ili210x_work与dwork成员绑定关系。
②调度工作队列
我们在probe函数中申请i2c中断,每当中断触发以后,就会执行中断函数ili210x_irq(int irq, void irq_data),在中断函数中调用schedule_delayed_work(&priv->dwork, 0);调度函数,就会执行与dwork成员绑定的函数ili210x_work。
至此,我们就讲完了工作队列WOEKQUEUE的使用方法,非常简单。
#include <linux/workqueue.h>
static void ili210x_work(struct work_struct *work)
{
struct ili210x *priv = container_of(work, struct ili210x,
dwork.work);
struct i2c_client *client = priv->client;
schedule_delayed_work(&priv->dwork,
msecs_to_jiffies(priv->poll_period));
}
static irqreturn_t ili210x_irq(int irq, void *irq_data)
{
struct ili210x *priv = irq_data;
schedule_delayed_work(&priv->dwork, 0);
return IRQ_HANDLED;
}
static int ili210x_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
INIT_DELAYED_WORK(&priv->dwork, ili210x_work);
request_irq(client->irq, ili210x_irq, pdata->irq_flags,
client->name, priv);
}
3.函数说明
初始化工作队列,将工作队列绑定函数
struct delayed_work _work;
INIT_DELAYED_WORK(_work, _func)
调度工作队列函数
schedule_delayed_work(&priv->dwork, READ_VDELAY );