INIT_WORK的疑惑

月光宝盒 2012-10-20 05:53:53
书上说函数INIT_WORK(struct work_struct *work, void (*function)(void *), void *data)初始化一个工作队列,函数的第二个参数是指"一段时间"后调用的函数,那么这个被调用的函数什么时间被调用呢,这个延迟时间是一个确定值还是一个大概的值呢?当被延时的函数被调用时,会不会出现两个线程?因为原先的程序也在运行.或者原先的程序在执行INIT_WORK就被阻塞,直到延时函数被调用后才继续运行?

好像代码中shudule_work()执行后,相应的回调函数不会立即执行,kernel有个线程调度。
以lcd backlight为例,上层关关闭背光实际是调用 shudule_work()就退出了。但后来lcd sleep了,这个而关背光的调度还没来就会造成白屏,但这个时间点怎么保证呢?
为什么不直接就去开/关背光,而用work,不使用work有什么弊端吗?
...全文
761 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
韩半仙 2013-09-25
  • 打赏
  • 举报
回复
同意四楼的理解
goodtalent 2013-05-03
  • 打赏
  • 举报
回复
这个背光问题我在实际的工作中还真遇到过了,是在用tp模拟距离感应的时候碰到的。
dyron 2012-11-22
  • 打赏
  • 举报
回复
运行是在shudule_work 的events调度时, queue_work 的特定线程运行时。
Panda_熊猫 2012-10-26
  • 打赏
  • 举报
回复
是不是你的 function里的操作太复杂因此而耗时引起的,尽量精简些吧。
linstu 2012-10-24
  • 打赏
  • 举报
回复
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中完成。

月光宝盒 2012-10-22
  • 打赏
  • 举报
回复
"我只能说说为什么不直接操作,而要用工作队列
因为中断处理函数里不能睡眠。所以必须把某些会睡眠的操作放在中断底半部去做。"
-->但是像led ,vibrator这些根本没有中断
谁能解释下调度的时间点,调用schedule_work后1s内还是N ms内会调用到work的回调函数呢?
如果这个时间点都不能保证,我怎么敢用work呢
zhudixu 2012-10-22
  • 打赏
  • 举报
回复
下个调度tick 就进入work的回调函数,可以说是实时的
deep_pro 2012-10-21
  • 打赏
  • 举报
回复
我只能说说为什么不直接操作,而要用工作队列
因为中断处理函数里不能睡眠。所以必须把某些会睡眠的操作放在中断底半部去做。

时间的保证我不知道。

因为操作系统总是喜欢把简单的东西封装起来,搞得复杂,搞得会引起睡眠。有好处也有坏处。好处就是提供一个统一的管理接口给上层软件。

你当然可以直接操作背光寄存器,如果确实有白屏现象的话。同时也得保留原来的工作队列,并修改寄存器操作部分。因为上层软件还是要依赖原工作队列获得当前背光状态。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧