1. 定义工作结构体 工作队列的核心是work_struct结构体,用于描述任务。可以通过宏定义或动态初始化来创建。 #include<linux/workqueue.h>// 定义全局或静态工作结构体DECLARE_WORK(my_work,my_work_handler);// 动态初始化工作结构体structwork_structmy_work;INIT_WORK(&my_
一个工作队列上是可以有多个work的,当然也可以针对一个工作队列来强制执行上面的多个work,使用flush_scheduled_work和flush_workqueue。flush_scheduled_work不带参数,特指system_wq,这是一个系统自带的工作队列。 flush_work(struct work_struct *work); flush_scheduled_work() flush_workqueue(struct workqueue_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); 取...
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}; 通...
work_struct结构体 使用work queue 创建work 创建工作队列 销毁工作队列 调度执行work 等待work 等待work queue work queue的内部机制 Linux 2.x的工作队列创建过程 Linux 4.x的工作队列创建过程 工作队列work queue 工作队列(work queue)是中断下半部的一种实现机制,主要用于耗时任务处理,由内核线程代表进程执行。工...
这样就会静态地创建一个名为name,待执行函数为func,参数为data的work_struct结构。 同样,也可以在运行时通过指针创建一个工作: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 INIT_WORK(struct work_struct*work,woid(*func)(void*),void*data); ...
struct work_struct{atomic_long_t data;//低比特存放状态位,高比特存放worker_pool的ID或者pool_workqueue的指针struct list_head entry;//用于添加到其他队列上work_func_t func;//工作任务的处理函数,在内核线程中回调#ifdefCONFIG_LOCKDEPstruct lockdep_map lockdep_map;#endif}; ...
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。
TP中断的处理,一般有种固定模式,两种实现方法,采用work_struct和work_struct workqueue_struct混合都可以处理。 (1)work_struct 定义报点函数 static struct work_struct msg21xx_wq; 1. static int touch_event_handler(void *unused) 1. probe中初始化 ...
static struct work_struct test_work; static struct delayed_work test_delayed_work; static void test_func(struct work_struct *work) { printk("%s, %d, %ld\n", __func__, __LINE__, jiffies); } static void test_delayed_func(struct work_struct *work) ...