Android内核驱动(linux内核驱动)中使用Completion

昨天的某一个sensor的驱动,需要实现这样一个功能,就是在workqueue里面采集到五次数据之后再传给ioctl平均之后再传给上 层。所以在workqueue里面未采集到五次时,如果有app调用到ioctl对应的读数据的接口,那么只能阻塞一会儿等到workqueue那边采集 到五次之后平均再给ioctl这边,然后ioctl才能继续往下走平均之后再给上层。

  那么这里刚好可以用complete,而且非常适合。

  现在总结一下completion的用法。

  completion是linux内核中一种简单的同步机制。

  要使用completion,必须在文件中包含<linux/completion.h>,同时创建一个类型为struct completion的变量。

  这个变量可以静态地声明和初始化: 

  DECLARE_COMPLETION(my_comp); 

  或者动态初始化: 

  struct completion my_comp; 

  init_completion(&my_comp); 

  如果驱动程序要在执行后面代码之前等待另一个过程完成之后再完成,就可以调用函数

  void wait_for_completion(struct completion *comp);

  wait_for_completion 等待在completion上。如果加了interruptible,就表示线程等待可被外部发来的信号打断;如果加了killable,就表示线程只可 被kill信号打断;如果加了timeout,表示等待超出一定时间  会自动结束等待,timeout的单位是系统所用的时间片jiffies(多为1ms)。

  如果其它部分代码可以确定事件已经完成,可以调用下面两个函数之一来唤醒等待该事件的进程:

  void complete(struct completion *comp); 

  void complete_all(struct completion *comp); /* Linux 2.5.x以上版本 */ 

  前一个函数将只唤醒一个等待进程,而后一个函数唤醒等待该事件的所以进程。由于completion的实现方式,即使complete在wait_for_competion之前调用,也可以正常工作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值