在很多情况下,设备驱动程序不需要有自己的工作队列。向队列提交任务,可以使用内核提供的共享的工作队列。共享队列不能长期独占,即不能长时间休眠。
头文件:
#include <linux/workqueue.h>
接口:
INIT_WORK(struct workqueue_struct *, void (func) (struct work_struct *));
int schedule_work(struct work_struct *);//提交任务到队列进行调度
int schedule_delayed_work(struct delayed_work *work, unsigned long delay);//以延迟的方式提交任务
int cancel_delayed_work(struct delayed_work *work);//取消某个挂起的工作队列入口项
void flush_scheduled_work(void);//刷新共享工作队列
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/workqueue.h>
typedef struct
{
char data[32];
struct work_struct test_work;
}MY_WORK_S;
static struct timeval lastTime;
static MY_WORK_S myWork;
static int cnt = 0;
void my_work_func(struct work_struct *work)
{
struct timeval curTime;
MY_WORK_S *p = container_of(work, MY_WORK_S, test_work);
printk("%s:%s\n", __func__, p->data);
do_gettimeofday(&curTime);
printk("interval: %ld s, %ld us\n",
curTime.tv_sec - lastTime.tv_sec, curTime.tv_usec - lastTime.tv_usec);
if (cnt <= 5)
{
schedule_work(work);
cnt++;
}
}
static int __init hello_init(void)
{
printk("hello_init. \n");
strcpy(myWork.data, "hello");
INIT_WORK(&myWork.test_work, my_work_func);
schedule_work(&myWork.test_work);
do_gettimeofday(&lastTime);
return 0;
}
static void __exit hello_exit(void)
{
printk("hello_exit. \n");
flush_scheduled_work();
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);