在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 2480|回复: 0

[原创] 驱动程序与应用程序间中断事件传递问题

[复制链接]
发表于 2015-4-14 23:29:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

大家好,我想通过电脑上的一个PCI9052的板卡每次接收到一个中断,应用程序就执行一次指定的函数。我写了windows的C++的应用程序,也照猫画虎写了一个简单的PCI驱动,功能实现了。可问题就是当我循环发送这个中断的时候,电脑会死机!!有时候函数执行了几百次,多的时候能执行几千次,但最后都死机了。死机时不光程序死了,连鼠标都没用了,只用重启。我把我实现这个功能的程序写在了下面,各位大侠帮忙看看会是哪的问题呢?是不是我的应用程序和驱动程序这种交互方式有问题?

应用程序:

先使用下面语句创建了一个事件

hDecodeEvent =CreateEvent(NULL,FALSE,FALSE,NULL);


把上面的事件传给驱动程序

         //NCDIVER下传译码线程事件

         bResult= DeviceIoControl(hDevice,                           //device to be queried

                   NC_TRANSMIT_EVENT,                                        //operation to perform

                   &hDecodeEvent,sizeof(hDecodeEvent),         // inputbuffer

                   NULL,0,                                                                     //output buffer

                   &junk,                                                                        //# bytes returned

                   (LPOVERLAPPED)NULL);                                      //synchronous I/O


在一个线程中死循环等待驱动程序激活这个事件,一旦激活就调用一个函数

DWORD WINAPI DecodeWaitThreadProc(LPVOIDlpParam)

{

         while(1)

         {

                   WaitForSingleObject(hDecodeEvent,INFINITE);      //等待事件激活

                   InterpdllCallbackFunction();    //激活后调用这个函数

         }

         return0;

}

驱动程序:

在驱动程序中这样接收事件

                   caseNC_TRANSMIT_EVENT:

                            pdx->hUserDecodeEvent= *(HANDLE*)Irp->AssociatedIrp.SystemBuffer;

                            status=ObReferenceObjectByHandle(pdx->hUserDecodeEvent,

                                                                 EVENT_MODIFY_STATE,

                                                                 *ExEventObjectType,

                          KernelMode,

                          (PVOID*) &pdx->pDecodeEvent,

                          NULL);

                            break;

驱动程序接收到中断后这样设置事件来通知应用程序

if(pdx->pDecodeEvent != NULL)

         KeSetEvent(pdx->pDecodeEvent,IO_NO_INCREMENT,FALSE);//通知应用程序,中断的到来

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

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 10:42 , Processed in 0.014985 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表