免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3044 | 回复: 4
打印 上一主题 下一主题

如何让工作队列中的函数立即调用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-24 17:20 |只看该作者 |倒序浏览
我现在需要在alsa的trigger函数进行i2c读写操作(这个操作暂命名为hw_mute)。需要注意的是:trigger必须是原子的,而i2c读写可睡眠,因此不能直接在trigger中进行hw_mute。
我目前的做法是使用工作队列,将hw_mute放到work_struct进行,然后在trigger中调用schedule_work()。这样基本能达成我的需求,但是带来一个问题:就是hw_mute总是有点滞后,大概0.1~0.3S左右,这样搞得用户体验不是很好。
请问有什么办法可以让trigger迅速进行hw_mute操作吗?标题不用太care,只要能做到这一点就行了。
谢谢各位。

论坛徽章:
0
2 [报告]
发表于 2011-02-24 17:46 |只看该作者
工作队列尽快调用意味着工作者线程需要尽快运行。
不如创建一个自己的工作者线程,这样或许比默认的工作者线程快些。毕竟别的模块也在用同一个线程

不知道内核线程是否可以设置优先级

论坛徽章:
0
3 [报告]
发表于 2011-02-24 20:04 |只看该作者
应该可以吧,它也是线程,创建的时候直接修改应该没有问题吧,不过没有试过。

论坛徽章:
0
4 [报告]
发表于 2011-02-24 22:15 |只看该作者
用create_workqueue创建一个workqueue线程,然后用queue_work调用工作队列。效果还是一样不行。线程优先级倒是没有试过。
如果实在没办法的话,那看能否改动alsa core了。

论坛徽章:
0
5 [报告]
发表于 2011-02-25 11:20 |只看该作者
问题解决了。
昨晚睡觉时想了又想,想了又想,怎么觉得queue_work都不会延迟100ms以上,应该是某个地方搞错了。
今天重新测试了一下,果然发现hw_mute设置的那个寄存器不会立即起作用,最起码延迟100ms才起作用。妹的,手册也没写清楚。
最后决定还是不设置hw mute寄存器了,直接令其功放power down,也起到我们所期望的效果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP