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。