lq519
驱动牛犊
驱动牛犊
  • 注册日期2001-12-09
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1588回复:7

我的中断,为何在VB中运行不稳定?

楼主#
更多 发布于:2002-04-18 21:35
我开发的PCI采集卡的,中断程序运VB运行为何不稳定?总进softice或兰屏。我的内核用事件与上面的动态库同步,唤醒线程!请班主和各位大虾,帮帮我?
lq519
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-19 08:58
你的问题太模糊了。照你的描述,我只能怀疑VB有问题,可是不会啊,别人都用。因此没法作答!
而实际上你的程序肯定应该是逻辑错误。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-04-19 09:29
用户被禁言,该主题自动屏蔽!
lq519
驱动牛犊
驱动牛犊
  • 注册日期2001-12-09
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-27 15:38
内核驱动程序相关部分:
VOID myDevice::DpcFor_Irq(PVOID Arg1, PVOID Arg2)
{
if(m_pEventToSignal!=NULL)
  m_pEventToSignal->Set();

UNREFERENCED_PARAMETER(Arg1);
UNREFERENCED_PARAMETER(Arg2);
}
BOOLEAN myDevice::Isr_Irq(void)
{        
if ((m_IoPortRange0.ind(0x38)/0x100000)==0xc)
{
ISvalue=m_IoPortRange1.inb(0x1c);  //清除中断标志
m_DpcFor_Irq.Request();
return TRUE;
}
else
return FALSE;  
}
NTSTATUS myDevice::my_IOCTL_IRQ0_Handler(KIrp I)//打开中断,使设备允许中断
{
NTSTATUS status;

hEvent=*(HANDLE*)I.IoctlBuffer();

if(m_pEventToSignal!=NULL)
{
   return STATUS_INSUFFICIENT_RESOURCES;
}
m_pEventToSignal=new(NonPagedPool)KEvent(hEvent);
status=(m_pEventToSignal!=NULL)?STATUS_SUCCESS:STATUS_INSUFFICIENT_RESOURCES;
I.Information()=0;

if(NT_SUCCESS(status))
{
   m_Irq.Connect(LinkTo(Isr_Irq),this);
        }
        m_IoPortRange0.outd(0x38,0x2000);//使我的设备允许中断
return status;
}
NTSTATUS myDevice::my_IOCTL_IRQ1_Handler(KIrp I)// 关闭中断,设备禁止中断
{
NTSTATUS status = STATUS_SUCCESS;
if(m_pEventToSignal!=NULL)
{
  m_pEventToSignal->Set();
  m_pEventToSignal=NULL;
  delete m_pEventToSignal;
}
m_IoPortRange0.outd(0x38,0x0); //禁止中断进来
I.Information()=0;
return status;
}
应用层相关部分:

打开中断:
__declspec(dllexport)  long _stdcall OpenIRQ(HANDLE* hList,ULONG hDeviceNum,void CALLBACK IrqCallBack(my* irq))
{
DWORD nOutput=0;
irqNum=hDeviceNum;

if(irqNum==0)return -2;

hEvent=new HANDLE[irqNum];
irqList=new HANDLE[irqNum];
for(int i=0;i<irqNum;i++)
{
hEvent=INVALID_HANDLE_VALUE;
irqList=INVALID_HANDLE_VALUE;
}

for(i=0;i<irqNum;i++)
{
irqList=hList;
hEvent=CreateEvent(NULL,false,false,NULL);
if (!DeviceIoControl((HANDLE)irqList,
     my_IOCTL_IRQ0,
     &(hEvent),
     sizeof(hEvent),
     NULL,
     0,
     &nOutput,
     NULL)
)
{
//printf(\"%d\",GetLastError());
CloseIRQ();
return -1;
}
}

DWORD ret=0;
OpenFlag=true;

CreateThread(NULL,NULL,(unsigned long (__stdcall*)(void*))CallBack,IrqCallBack,0,&ret);

return 0;

}
关闭中断:
__declspec(dllexport)  long _stdcall CloseIRQ()
{
DWORD nOutput=0;
for(int i=0;i<irqNum;i++)
{
if(irqList==INVALID_HANDLE_VALUE)
{
return 0;
}
if (!DeviceIoControl((HANDLE)irqList,
     my_IOCTL_IRQ1,
     &hEvent,
     sizeof(hEvent),
     NULL,
     0,
     &nOutput,
     NULL)
  )
{
return -1;
}
CloseHandle(hEvent);
}
OpenFlag=false;
delete hEvent;
delete irqList;
irqNum=0;

return 0;
}
应用层中断处理:
ULONG CALLBACK CallBack(void CALLBACK irqcallback(my* sirq))
{
my sirq;
ULONG RetForWait=0xffffffff;
while(OpenFlag)
{
RetForWait=WaitForMultipleObjects(irqNum,hEvent,false,INFINITE);
sirq.lIndex=RetForWait;
irqcallback(&sirq);
}
return 0;
}

***************************
我对有关概念很模糊,二位大虾,再说几句可以吗?
所以谢谢二位了!!!

lq519
lq519
驱动牛犊
驱动牛犊
  • 注册日期2001-12-09
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-27 15:43
上面太乱了,请见附件!
lq519
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-17 16:28
这位大哥,你上面的程序后来调通了吗?
驱动,俺不懂,有没有人管啊?
llshi
驱动老牛
驱动老牛
  • 注册日期2001-05-05
  • 最后登录2016-01-16
  • 粉丝0
  • 关注0
  • 积分5300分
  • 威望26500点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-18 19:22
m_pEventToSignal->Set()不能在irq中,否则就不稳定,它放在dpc中就没问题。

dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-18 22:13
不知道回调函数怎么用,高手指教
驱动,俺不懂,有没有人管啊?
游客

返回顶部