sundonga 2015-04-14 15:17 采纳率: 83.3%
浏览 2408

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

大家好,我想通过电脑上的一个PCI9052的板卡每次接收到一个中断,应用程序就执行一次指定的函数。我写了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), // input buffer
NULL,0, // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O

在一个线程中死循环等待驱动程序激活这个事件,一旦激活就调用一个函数
DWORD WINAPI DecodeWaitThreadProc(LPVOID lpParam)
{
while (1)
{
WaitForSingleObject(hDecodeEvent,INFINITE); //等待事件激活
InterpdllCallbackFunction(); //激活后调用这个函数
}
return 0;
}
驱动程序:
在驱动程序中这样接收事件
case NC_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);//通知应用程序,中断的到来

  • 写回答

3条回答 默认 最新

  • oyljerry 2015-04-14 15:27
    关注

    可以添加一些日志log看你的应用程序和驱动死机前都运行到在在哪个函数。

    评论

报告相同问题?

悬赏问题

  • ¥15 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波