阅读:1588回复:7
我的中断,为何在VB中运行不稳定?
我开发的PCI采集卡的,中断程序运VB运行为何不稳定?总进softice或兰屏。我的内核用事件与上面的动态库同步,唤醒线程!请班主和各位大虾,帮帮我?
|
|
|
沙发#
发布于:2002-04-19 08:58
你的问题太模糊了。照你的描述,我只能怀疑VB有问题,可是不会啊,别人都用。因此没法作答!
而实际上你的程序肯定应该是逻辑错误。 |
|
|
板凳#
发布于:2002-04-19 09:29
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于: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; } *************************** 我对有关概念很模糊,二位大虾,再说几句可以吗? 所以谢谢二位了!!! |
|
|
地下室#
发布于:2002-04-27 15:43
上面太乱了,请见附件!
|
|
|
5楼#
发布于:2002-06-17 16:28
这位大哥,你上面的程序后来调通了吗?
|
|
|
6楼#
发布于:2002-06-18 19:22
m_pEventToSignal->Set()不能在irq中,否则就不稳定,它放在dpc中就没问题。
|
|
7楼#
发布于:2002-06-18 22:13
不知道回调函数怎么用,高手指教
|
|
|