阅读:1336回复:3
紧急求助:kewaitforsingleobject()问题
问题是这样的:
我没有用桥芯片,直接用FPGA实现PCI协议的。 用事件来实现驱动和应用的同步,所有事件的操作都在驱动中完成。 TOMDRIVER_IOCTL_801_Handler(KIrp I) 中创建事件, TOMDRIVER_IOCTL_802_Handler(KIrp I) 应用程序读数的IOCTL,同时在这里做了等待,用kewaitforsingleobject等待中断来才开始调用memcpy函数。 BOOLEAN CyxdriverDevice::Isr_Irq(void) 中KeSetEvent。 硬件pci协议上做了规定,当硬件接收到足够的数据时,pci发出中断,此时才开始数据传输。 应用程序是多线程的,其中一个线程是专门用作PCI读数的。在该线程中先调用801,再循环调用802读数。 现在出现的问题是,应用程序运行一段时间后就会突然停掉,收数的线程停止了。用打印语句跟踪发现是停在驱动的802的kewaitforsingleobject语句。用DriverWizard往中断寄存器中直接写入中断,跟踪到驱动运行了中断服务程序,但是事件还是没有被激活,仍然停在kewaitforsingleobject函数处。 是不是kewaitforsingleobject这样使用不对呢,还是说会有什么负面影响?以前我是在中断中设置一个信号量,中断来了,设为有效。在802中不断查询该信号量,当其有效时才 才接收数据。不会出现这个问题,就是cpu资源太高,用了EVENT后,CPU资源就降下来了。 能不能帮我看看。我看在你的pdc1000驱动里面也用了kewaitforsingleobject,没出现过 问题,是不是还要进行一些其他的设置呢? 这个问题很急,我调了2天了,都没解决。帮忙看看吧,谢了!! 驱动程序中的相关代码: PKEVENT pEvent; HANDLE hEvent; NTSTATUS CyxdriverDevice::TOMDRIVER_IOCTL_801_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; WCHAR wEventNameBuf[]=L"\\BaseNamedObjects\\SharedEvent"; UNICODE_STRING uEventName; RtlInitUnicodeString(&uEventName,wEventNameBuf); pEvent = IoCreateNotificationEvent(&uEventName,&hEvent); KeResetEvent(pEvent); m_IoPortRange0.outd(4,4026531847); // open 263 door m_IoPortRange0.outd(8,phyadd); // write physical address or memory buffer // 上面两句代码跟我们下面具体的电路设计有关。 I.Information() = 4; return status; } NTSTATUS CyxdriverDevice::TOMDRIVER_IOCTL_802_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; unsigned long reg = 0; unsigned long reg1 = 0; unsigned int time = 0; LARGE_INTEGER OneSecondTimeout; OneSecondTimeout.QuadPart = -1i64 * 1000000i64 * 10i64; do{ KeResetEvent(pEvent); m_IoPortRange0.outd(0,15); KeWaitForSingleObject((PKEVENT)pEvent,Executive,KernelMode,FALSE,&OneSecondTimeout); memcpy((char *)I.IoctlBuffer(),(char *)viradd,1024); I.Information() = 1024; return status; } BOOLEAN CyxdriverDevice::Isr_Irq(void) { KeSetEvent((PKEVENT)pEvent, 0, FALSE); return TRUE; } 应用程序中的相关代码: int door ; UINT PCIThread(LPVOID lpParam) { ULONG nOutput,o2; // Count written to bufOutput unsigned char *data; unsigned long input = 50; int sleep_cnt = 0; int id=0; door = 1; data = (unsigned char *)malloc(2048); if (!DeviceIoControl(hDevice, TOMDRIVER_IOCTL_801, NULL, 0, NULL, 0, &o2, NULL) ) { AfxMessageBox("ERROR: DeviceIoControl801 returns %0x.", GetLastError()); exit(1); } do{ if (!DeviceIoControl(hDevice, TOMDRIVER_IOCTL_802, &input, 4, data, 1024, &nOutput, NULL) ) { AfxMessageBox("ERROR: DeviceIoControl returns %0x.", GetLastError()); exit(1); }else { pDlg->m_myadder+=1024; pDlg->m_lib.q.put(data); for(id=0;id<1024;id++) { if (memcmp(data+id,startcode,3)==0) pDlg->m_myframe++; } } }while(door==1); return 0; } |
|
沙发#
发布于:2004-08-16 08:42
各位大侠说说看吧,谢了
|
|
板凳#
发布于:2004-08-17 18:38
nobody know?
|
|
地板#
发布于:2004-08-17 19:47
nobody know
|
|
|