surfing1
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1336回复:3

紧急求助:kewaitforsingleobject()问题

楼主#
更多 发布于:2004-08-14 15:17
问题是这样的:
我没有用桥芯片,直接用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;
}
surfing1
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-16 08:42
各位大侠说说看吧,谢了
surfing1
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-17 18:38
nobody know?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-08-17 19:47
nobody know
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部