经验说:
工作队列使用上和 tasklet最大的不同是工作队列的函数可以使用休眠,而tasklet的函数是不允许使用休眠的。
工作队列一般用来做滞后的工作,比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到等待队列。就是系统延时调度的一个自定义函数。
在2.6.20之后的版本,这INIT_WORK(struct work_struct *work, void (*function)(void *), void *data)改为现在的两个参数,最后的那个data参数不带
了。data数据直接进入一个包含work_struct的自己定义的结构体了。
struct my_work_stuct{
int test;
struct work_stuct save;
};
使用步骤:
1、定义struct my_work_stuct irq_queue;
2、初始化INIT_WORK(&iirq_queue.save,do_irq_queuework);
3、调用方法:schedule_work(&irq_queue);
注,调用完毕后系统会释放此函数,所以如果想再次执行的话,就再次调用schedule_work()即可。
另外,内核必须挂载文件系统才可以使用工作队列。我的理解是:工作队列也属于调度,如果内核挂了,他就不调度了,当然就不能用工作队列了。
工作队列的使用又分两种情况,一种是利用系统共享的工作队列来添加自己的工作,这种情况处理函数不能消耗太多时间,这样会影响共享队列中其他任务的处
理;另外一种是创建自己的工作队列并添加工作。
(一)利用系统共享的工作队列添加工作:
第一步:编写一个工作队列结构体,
工作队列使用上和 tasklet最大的不同是工作队列的函数可以使用休眠,而tasklet的函数是不允许使用休眠的。
工作队列一般用来做滞后的工作,比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到等待队列。就是系统延时调度的一个自定义函数。
在2.6.20之后的版本,这INIT_WORK(struct work_struct *work, void (*function)(void *), void *data)改为现在的两个参数,最后的那个data参数不带
了。data数据直接进入一个包含work_struct的自己定义的结构体了。
struct my_work_stuct{
int test;
struct work_stuct save;
};
使用步骤:
1、定义struct my_work_stuct irq_queue;
2、初始化INIT_WORK(&iirq_queue.save,do_irq_queuework);
3、调用方法:schedule_work(&irq_queue);
注,调用完毕后系统会释放此函数,所以如果想再次执行的话,就再次调用schedule_work()即可。
另外,内核必须挂载文件系统才可以使用工作队列。我的理解是:工作队列也属于调度,如果内核挂了,他就不调度了,当然就不能用工作队列了。
工作队列的使用又分两种情况,一种是利用系统共享的工作队列来添加自己的工作,这种情况处理函数不能消耗太多时间,这样会影响共享队列中其他任务的处
理;另外一种是创建自己的工作队列并添加工作。
(一)利用系统共享的工作队列添加工作:
第一步:编写一个工作队列结构体,