免费注册 查看新帖 |

Chinaunix

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

[进程管理] 请问如何让INIT_WORK的工作项在kworker线程一直运行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-25 10:48 |只看该作者 |倒序浏览
最近在android平台调试一个音频项目时需要使用INIT_WORK,循环调用schedule_work();去写音频数据,出现了概率性播放音频卡顿的情况,怀疑和INIT_WORK所在的kworker线程被其他工作项占用有关,请教各位大神要怎么解决这个问题?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2016-11-25 12:44 |只看该作者
这个接口本来就是调度一次性任务的,周期性任务需要显式的反复调用schedule_work。

任务的调度实体缺省是keventd(可能记错了),所以跟其它work存在竞争关系。
但也可以创建自己的(专用)调度线程(通过创建自己的workqueue来完成)。

workqueue的实现在高版本内核里发生过一次重要的变化,android是哪种情况就不太清楚了。

论坛徽章:
0
3 [报告]
发表于 2016-12-01 11:16 |只看该作者
那请问如何保证schedule_work调度的过程中不被其他任务影响呢?

论坛徽章:
11
程序设计版块每日发帖之星
日期:2015-09-09 06:20:00CU十四周年纪念徽章
日期:2016-05-16 11:11:112016科比退役纪念章
日期:2016-05-04 17:16:57程序设计版块每日发帖之星
日期:2016-02-20 06:20:00程序设计版块每周发帖之星
日期:2015-11-06 19:30:58程序设计版块每日发帖之星
日期:2015-09-12 06:20:00程序设计版块每日发帖之星
日期:2015-09-11 06:20:00每日论坛发贴之星
日期:2015-09-10 06:20:00程序设计版块每日发帖之星
日期:2015-09-10 06:20:00每日论坛发贴之星
日期:2015-09-09 06:20:0015-16赛季CBA联赛之四川
日期:2016-12-15 15:52:10
4 [报告]
发表于 2016-12-01 13:38 |只看该作者
很好奇为什么不是在中断底半步处理音频数据而是使用工作队列处理数据呢?

论坛徽章:
0
5 [报告]
发表于 2016-12-02 11:07 |只看该作者
这个是使用USB Audio Class协议,PC做为主机,android设备作为从机,实现PC端播放音乐,然后从android设备输出的功能。

论坛徽章:
0
6 [报告]
发表于 2016-12-02 11:21 |只看该作者
如f_uac1.zip中的f_uac1.c驱动,PC通过USB传输音频数据到android设备,会一直调用到f_audio_out_ep_complete函数中的schedule_work(&audio->playback_work)。

论坛徽章:
0
7 [报告]
发表于 2016-12-02 11:29 |只看该作者
  1. static int f_audio_out_ep_complete(struct usb_ep *ep, struct usb_request *req)
  2. {
  3.         struct f_audio *audio = req->context;
  4.         struct usb_composite_dev *cdev = audio->card.func.config->cdev;
  5.         struct f_audio_buf *copy_buf = audio->copy_buf;
  6.         int err;

  7.         if (!copy_buf)
  8.                 return -EINVAL;

  9.         /* Copy buffer is full, add it to the play_queue */
  10.         if (audio_buf_size - copy_buf->actual < req->actual) {
  11.                 list_add_tail(&copy_buf->list, &audio->play_queue);
  12.                 schedule_work(&audio->playback_work);
  13.                 copy_buf = f_audio_buffer_alloc(audio_buf_size);
  14.                 if (IS_ERR(copy_buf))
  15.                         return -ENOMEM;
  16.         }

  17.         memcpy(copy_buf->buf + copy_buf->actual, req->buf, req->actual);
  18.         copy_buf->actual += req->actual;
  19.         audio->copy_buf = copy_buf;

  20.         err = usb_ep_queue(ep, req, GFP_ATOMIC);
  21.         if (err)
  22.                 ERROR(cdev, "%s queue req: %d\n", ep->name, err);

  23.         return 0;

  24. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2016-12-02 11:47 |只看该作者
相关的驱动如附件的f_uac1.zip,麻烦帮忙分析下。

f_uac1.zip

8.15 KB, 下载次数: 24

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP