work_struct的数据结构如下,暂时我们还无法关注其原理,只关注如何去开启一个work #include<linux/include/workqueue.h>typedefvoid(*work_func_t)(structwork_struct *work);structwork_struct{atomic_long_tdata;structlist_headentry;work_func_tfunc;#ifdefCONFIG_LOCKDEPstructlockdep_maplockdep_map;#endif}; 通...
中断handler中通过调用到work_struct work结合queue_struct来调用报点函数 static void tpd_eint_handler(void) { queue_work(mtk_tpd_wq, &work); } 1. 2. 3. 4. 在模块exit函数中,注销workqueue_struct destroy_workqueue(mtk_tpd_wq); 1. ===定时处理delayed_work=== delayed_work是在work_struct的基...
schedule_work(struct work_struct *work) schedule_work_on(int cpu, struct work_struct *work) 一个work可以被调度到系统的任意一个CPU,也可以被调度在指定的CPU,这就是以上两个API的区别。 取消一个work_struct cancel_work(struct work_struct *work); cancel_work_sync(struct work_struct *work); 取...
struct work_struct{unsigned long pending;/* 这个工作正在等待处理吗?*/struct list_head entry;/* 连接所有工作的链表 */void(*func)(void*);/* 要执行的函数 */void*data;/* 传递给函数的参数 */void*wq_data;/* 内部使用 */struct timer_list timer;/* 延迟的工作队列所用到的定时器 */}; 这...
一、核心数据结构 1. struct work_struct 2. struct cpu_workqueue_struct 3. struct workqueue_struct 4. 这三个数据结构之间的关系5. 工作队列实现框架(singlethread) 二、创建并初始化工作队列工作者线程相关参…
static void test_delayed_func(struct work_struct *work) { printk("%s, %d, %ld\n", __func__, __LINE__, jiffies); } static int __init test_init(void) { int ret; printk("%s, %d, %ld\n", __func__, __LINE__, jiffies); ...
编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有delayed_work以及workqueue_struct,抱着知其然并知其所以然的态度,在这里归纳总结一下work_struct,以及如何在驱动中使用,因为工作队列相对...
work->data);}// 初始化模块staticint __initmy_module_init(void){int i;struct work_struct work[3];// 创建工作队列my_workqueue=create_singlethread_workqueue("my_workqueue");// 添加任务到工作队列for(i=0;i<3;i++){INIT_WORK(&work[i],my_work_handler);work[i].data=&i;queue_work(my...
struct work_struct n=__WORK_INITIALIZER(n,f) 举例如下: staticvoiddo_poweroff(struct work_struct*dummy){kernel_power_off();}staticDECLARE_WORK(poweroff_work,do_poweroff); 即创建了一个全局静态变量:static work_struct poweroff_work,且被初始化了,其执行函数为do_poweroff。
1创建一个队列就会有一个内核线程,一般不要轻易创建队列2位于进程上下文--->可以睡眠3定义:4struct work_struct work;56初始化:7INIT_WORK(struct work_struct*work,void(*func)(struct work_struct*work));89定义并初始化:10DECLARE_WORK(name,void(*func)(struct work_struct*work));1112===1314调度:15in...