阅读:1187回复:8
求用回调函数实现采集卡的实现方案
我要给一片七号信令采集卡写驱动。最终想做成的接口为当收到一个完整的信令包后,调用用户的回调函数。但是我不明白回调函数的功能应该在哪里实现呢?在DLL里?还是在驱动里?
如果是在DLL里实现,那么DLL访问驱动只能用ReadFile,WriteFile,DeviceIoControl,那么在DLL里就要轮询(不停从设备缓冲中读取数据,再判断是否收完一个完整的包),有没有不用轮询的方法呢?(我认为轮询的效率太低) |
|
沙发#
发布于:2003-05-15 17:45
你要在什么操作系统下作
:D |
|
|
板凳#
发布于:2003-05-15 17:59
在DLL中注册一个event,将它在应用态与内核态共享,
然后在DLL中等候这个event,可用WaitSingleObject, 在驱动中遇到中断或是你认为需要调用时,就将此event置起, DLL中就等到此事件了,然后就可调用用户的回调函数了。 |
|
地板#
发布于:2003-05-15 19:05
我是写WDM驱动。
在驱动中打开event是不是用IoCreateNotificationEvent? 另外我觉得是不是在驱动中用IoCreateNotificationEvent建立一个event,然后在DLL中打开会更好一些呢?因为总是驱动先起来然后dll才起来,这样能够保证在dll打开event时,event总是存在的;如果在dll中注册一个event,那么在驱动中似乎只能在IRP_MJ_CREATE中打开比较合适。不知道我的想法对不对? |
|
地下室#
发布于:2003-05-15 19:55
还是用版主说的方法比较好,通常情况下采集卡都是这样做的
|
|
|
5楼#
发布于:2003-05-15 20:02
我是写WDM驱动。 不是很明白你的意思,通常都是在用户空间中创建event,用read、write或deviceiocontrol传给内核空间的驱动,驱动在获得数据后将event置为信号态,这样在用户空间中程序就得到通知去读取驱动返回的数据。 看你的意思是在内核驱动中建event,在用户空间的dll中置信号态?不知道这样行不行的通,不过你可以试试 |
|
|
6楼#
发布于:2003-05-15 20:20
也可以在driver创建有名字的event,dll用这个名字open之。
|
|
7楼#
发布于:2003-05-15 20:38
也可以在driver创建有名字的event,dll用这个名字open之。 是吗?偶明天回去试试 |
|
|
8楼#
发布于:2003-05-15 22:01
谢谢大家在百忙中抽出时间回答偶的问题!
等我先试一下,有了结果后就给大家分! hehe |
|