大家好,我想通过电脑上的一个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);//通知应用程序,中断的到来