INIT_WORK

借助runtime pm,在需要使用模块时,增加引用计数(可调用pm_runtime_get),不需要使用时,减少引用计数(可调用pm_runtime_put)。

1.INIT_WORK(struct work_struct *work, void (*function)(void *), void *data)
上面一句只是定义了work和work对应的操作。
要是在实际使用的时候还是需要你去在适当的条件下激活这个work。只有激活了这个work,
这个work才有运行的机会。这个激活操作接口是shudule_work或是queue_work。
这两个接口之后只是说这个work有了运行的机会,但是具体到什么时候运行,那要看你用哪个接口激活的。
如果是shudule_work的话,系统中有个events内核线程,这个线程会处理你用shudule_work接口激活
的所有work。如果是queue_work的话,一般这种情况都是自己创建了一个单独的处理线程,这样将
你激活的work和这个线程联系起来。至于什么时候运行,那就是events或是你定义的特定线程运行的时候。

2.至于你提到的为什么要用到work。这个的话,我个人的理解是:一般用在对耗时处理上。比如,
当中断发生的时候,你可以在中断上下文中完成激活操作,让那些耗时的操作在work中完成。

时间: 2024-10-12 02:56:43

INIT_WORK的相关文章

内核工作队列workqueue

LDD3: 工作队列是, 表面上看, 类似于 taskets; 它们允许内核代码来请求在将来某个时间调用一个函数. 但是, 有几个显著的不同在这 2 个之间, 包括: (1) tasklet 在软件中断上下文中运行的结果是所有的 tasklet 代码必须是原子的. 相反, 工作队列函数在一个特殊内核进程上下文运行; 结果, 它们有更多的灵活性. 特别地, 工作队列函数能够睡眠. (2) tasklet 常常在它们最初被提交的处理器上运行. 工作队列以相同地方式工作, 缺省地. (3) 内核代码可

Linux workqueue疑问【转】

转自:http://blog.csdn.net/angle_birds/article/details/9387365 各位大神,你们好.我在使用workqueue的过程中遇到一个问题. 项目采用uClinux系统,VoIP相关的. 现有两个驱动,一个是负责数据传输的,还有一个是负责打电话的.这两个驱动里分别使用了一个workqueue.在数据传输量很大时,负责数据传输的workqueue非常耗费资源,CPU占用能达到60-70%.这时候,我打电话,也就是让负责打电话的workqueue工作,但

Linux中断分层技术

一.中断嵌套  当系统正在执行某中断处理函数时,又产生了一个新的中断,这就叫做中断嵌套.当中断为慢速中断时,新的中断会取代当前中断,即当前中断没有执行完就结束 了:当中断为快速中断时,新的终端就不会产生.这两种情况都是我们不愿意看到的情况,所以就有了今天的题目——中断分层. 二.中断分层 中断分层是将中断处理函数分为上下两个部分.上半部是与硬件相关的,下半部是与硬件无关的.与硬件无关的内容我们就可以将它分离出中断处理函数,交给内核在系统空闲的时候处理,这样就缩短了中断处理的时间,从而减小了中断丢

内核的基础层和应用层

◆ 第 1 章 内核的基础层和应用层1.1.1 内核中使用内存简单说,内核提供了两个层次的内存分配接口.一个是从伙伴系统分配,另一个是从slab 系统分配.伙伴系统是最底层的内存管理机制,提供页式的内存管理,而 slab 是伙伴系统之上的内存管理,提供基于对象的内存管理.从伙伴系统分配内存的调用是 alloc_pages,注意此时得到的是页面地址,如果要获得能使用的内存地址,还需要用 page_address 调用来获得内存地址.如果要直接获得内存地址,需要使用 __get_free_pages

《Linux Device Drivers》 第七章 时间、延时及延缓操作——note

度量时间差 内核通过定时器中断来跟踪时间流 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ的值设定,在常见的x86 PC平台上,默认定义为1000 <linux/param.h> <linux/timex.h> jiffies_64 unsigned long jiffies 使用jiffies计数器 <linux/jiffies.h> int time_after(unsigned long a, unsigned long b); int time

__init net_dev_init

Kernel: 4.12.6 网络设备初始化,主要包括初始化softnet_data,注册收发包软中断等: 1 static int __init net_dev_init(void) 2 { 3 int i, rc = -ENOMEM; 4 5 BUG_ON(!dev_boot_phase); 6 7 //初始化统计信息的proc文件 8 if (dev_proc_init()) 9 goto out; 10 11 //初始化kobject 12 if (netdev_kobject_init

光传感器和距离传感器代码分析【转】

本文转载自:http://blog.csdn.net/luobin1984/article/details/8132889 Light Sensor& Proximity Sensor TMD27713T内部集成一个光传感器,一颗红外发射管和一颗红外接收极管. ALS环境光传感器,距离检测和红外灯在一个模块上,ALS:近似于人眼的反应,可编程积分时间,可编程的中断阀值,很高的灵敏度.距离检测:校准到100mm的精度,消除工厂校准,可编程的数字红外脉冲.可编程的电流源的红外灯,可编程的中断阀值,可

Linux tasklet 和workqueue学习

中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化.但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失.因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟.例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行的状态,其余的处理稍后再进行(如把数据移入一个缓冲区,接受数据的进程就可以

Linux workqueue工作原理 【转】

转自:http://blog.chinaunix.net/uid-21977330-id-3754719.html 转自:http://bgutech.blog.163.com/blog/static/18261124320116181119889/1. 什么是workqueue       Linux中的Workqueue机制就是为了简化内核线程的创建.通过调用workqueue的接口就能创建内核线程.并且可以根据当前系统CPU的个 数创建线程的数量,使得线程处理的事务能够并行化.workqu