上·志

上下求索,志在千里。

导航

linux kernel不同驱动间使用completion同步问题

Posted on 2013-05-28 17:26  Shangzhi  阅读(485)  评论(0编辑  收藏  举报

linux kernel不同驱动间使用completion同步问题

author:朱上志

Date:2013.05.28

 

要在键盘和扫描头驱动之间进行同步: 当某一个按键按下后,就通知条码枪驱动去触发扫描头。在wince下可以通过SetEvent和WaitForSingleObject来实现,因为只是linux新手,一开始不知道怎么在linux内核中实现。通过找资料,似乎使用completion可以实现,但是找到的completion的使用例子都只在一个驱动内部的,没有不同驱动之间的例子。我一开始的做法是在一个公共的头文件里创建completion:

static DECLARE_COMPLETION(my_completion);

然后在扫描头驱动里新建一个线程,在里面等待completion:

wait_for_completion(&my_completion);

在某个按键按下后,就在键盘驱动里触发completion:

complete(&my_completion);

但是总是无法唤醒扫描头的wait_for_completion,似乎使用头文件的形式不行。

现在的做法是去掉公共头文件里的定义,而在键盘驱动里定义completion,并EXPORT_SYMBOL之:

static struct completion my_completion;

EXPORT_SYMBOL(my_completion);

在键盘驱动的初始化里初始化之:

init_completion(&my_completion);

在扫描头驱动里声明之:

extern static struct completion my_completion;

这样的话,每次特定按钮按下都能触发扫描头里的completion。