INIT_WORK
来源:互联网 发布:东方project mac版 编辑:程序博客网 时间:2024/05/21 09:51
以前内核里对这个函数是这样定义的 #define INIT_WORK(_work, _func, _data),可以理解为INIT_WORK会在你定义的_work工作队列里面增加一个工作任务,该任务就是_func。_func这个任务会需要一些数据作为参数,这个参数就是通过_data传递的。
而现在看驱动的时候你会发现调用INIT_WORK的时候是只有两个参数,去掉了数据的部分。也许你会问怎么传递data呢,等下会讲述到。其实现在我对这个理解还是比较模糊,希望各位说说你们的理解,顺便也让我理解更透彻一点。看许多驱动模块的时候会发觉work就是一个工作队列,一般是结构体work_struct,主要的目的就是用来处理中断的。比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到工作队列。说白了就是系统延时调度的一个自定义函数。
现在已goodix的触摸屏列举一下步骤:
1. 在探测函数里goodix_ts_probe初始化
INIT_WORK(&ts->work, goodix_ts_work_func);//struct work_struct work,ts是client私有数据结构体
主要目的就是因为就算没有中断,在第一次开机时也有检测设备,所以这个任务一开始就执行,只不过到后来中断发生后就再执行.
2. 现在当然轮到static void goodix_ts_work_func(struct work_struct *work)这个工作任务了
在这个函数里会有一句:
struct goodix_ts_data *ts = container_of(work, struct goodix_ts_data, work);
这函数的主要目的就是解决前面所说的我们的data跑哪去了,使用container_of这个函数来求出我们的data的指针
3.当然你不能忘记注册你的中断函数了
request_irq(client->irq, goodix_ts_irq_handler,pdata->irq_edge ? IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING,client->name, ts);
所以用一个结构体ts就可以把中断,任务,设备名等全部囊括进来
我理解就差不多是这样的。希望大叔级任务指出不正之处。
阅读全文
0 0
- INIT_WORK
- INIT_WORK的暂时理解
- INIT_WORK宏定义解释
- 对INIT_WORK的理解
- linux INIT_WORK 工作队列
- INIT_WORK和INIT_DELAYED_WORK详解
- 对INIT_WORK的理解
- 对INIT_WORK的理解
- INIT_WORK和INIT_DELAYED_WORK详解
- 对INIT_WORK的理解
- INIT_WORK和INIT_DELAYED_WORK详解
- 对INIT_WORK的理解
- INIT_WORK和container_of
- INIT_WORK和INIT_DELAYED_WORK详解
- INIT_WORK和INIT_DELAYED_WORK详解
- INIT_WORK和INIT_DELAYED_WORK详解
- INIT_WORK和INIT_DELAYED_WORK详解
- INIT_WORK和INIT_DELAYED_WORK详解
- 查看oracle数据库的连接数以及用户
- F-One在生物医药领域的“大数据”开拓与应用
- Markdown系列(9)- Markdown的优势与局限
- 和前端撕出逼格,撕的硬气
- 如何编写一个拼写纠错器?
- INIT_WORK
- 产品新人的10字生存手册
- 「产品规划」的那些事儿
- leetcode_670. Maximum Swap ? 待解决
- 别让扁平化设计平淡无奇
- GRE Words
- 1029. 旧键盘(20)
- Git常用命令速查表
- matplotlib基础学习