一个ISA卡的vxd中断采集程序,帮忙看看出了什么问题?
5w1h 2003-10-15 01:51:17 初次编驱动程序,好像不能运行,没有达到预期的效果,也不知道是什么问题,大虾帮忙指点一下啦!
//constecg.h
#define DIOC_RUN 100
#define DIOC_DATAREQ 200
struct Data {
DWORD nIndex;//采样序列号
WORD data[13];//13个通道的采样数值
};
PDWORD pU=(PDWORD)0x9fffc;
// ECG.h - include file for VxD ECG
#include <vtoolscp.h>
#define DEVICE_CLASS EcgDevice
#define ECG_DeviceID UNDEFINED_DEVICE_ID
#define ECG_Init_Order UNDEFINED_INIT_ORDER
#define ECG_Major 1
#define ECG_Minor 0
#define TestIrq 10 //定义中断号为 IRQ10
//派生类MyHwInt
class MyHwInt:public VHardwareInt
{
public:
MyHwInt();
virtual VOID OnHardwareInt(VMHANDLE hVM);//重载OnHardwareInt函数
};
class EcgDevice : public VDevice
{
public:
virtual BOOL OnSysDynamicDeviceInit();
virtual BOOL OnSysDynamicDeviceExit();
virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams);
MyHwInt *pMyIRQ;
};
class EcgVM : public VVirtualMachine
{
public:
EcgVM(VMHANDLE hVM);
};
class EcgThread : public VThread
{
public:
EcgThread(THREADHANDLE hThread);
};
// ECG.cpp - main module for VxD ECG
#define DEVICE_MAIN
#include "ecg.h"
Declare_Virtual_Device(ECG)
#undef DEVICE_MAIN
#include "constecg.h"
Data *pData0=NULL;
Data *pData1=NULL;
DWORD nNumber;
int nChannel;
EcgVM::EcgVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}
EcgThread::EcgThread(THREADHANDLE hThread) : VThread(hThread) {}
//MyHwInt 的实现函数部分
MyHwInt::MyHwInt():VHardwareInt(TestIrq,0,0,0){}
VOID MyHwInt::OnHardwareInt(VMHANDLE hVM)
{
_outp(0x352,1);//硬件设计关闭中断
switch (nNumber%2)
{
case 0:
pData0->nIndex=nNumber;
pData0->data[nChannel]=_inp(0x034c);
break;
case 1:
pData1->nIndex=nNumber;
pData1->data[nChannel]=_inp(0x034c);
break;
}
nChannel+=1;//通道+1
if(nChannel==13)
{
nChannel=0;
nNumber++;
*pU=1;
//等待2ms的脉冲
do{}while((_inp(0x343)&0x02)==2);
do{}while((_inp(0x34e)&0x02)==0);
}
_outp(0x34a,nChannel);//选择通道
_outp(0x34c,0x48);//送控制字
sendPhysicalEOI();//通知PCID重新允许该中断
}
BOOL EcgDevice::OnSysDynamicDeviceInit()
{
pMyIRQ=new MyHwInt();
*pU=0;
if(pMyIRQ&&pMyIRQ->hook())
{
_outp(0x350,0);//硬件设计选通三态门使得IRQ10连通A/D 的INT引脚
pMyIRQ->physicalUnmask();
return TRUE;
}
else
return FALSE;
}
BOOL EcgDevice::OnSysDynamicDeviceExit()
{
pMyIRQ->unhook();
pMyIRQ->physicalMask();
delete pMyIRQ;
return TRUE;
}
DWORD EcgDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
switch (pDIOCParams->dioc_IOCtlCode)
{
case DIOC_OPEN:
nChannel=0;
nNumber=0;
break;
case DIOC_CLOSEHANDLE:
break;
case DIOC_RUN:
//等待2ms脉冲
do{}while((_inp(0x343)&0x02)==2);
do{}while((_inp(0x34e)&0x02)==0);
_outp(0x34a,nChannel);//选择通道
_outp(0x34c,0x48);//送控制字
break;
case DIOC_DATAREQ://数据获取
if(*pU==0)
return 1;
switch(nNumber%2)
{
case 0:
memcpy(pDIOCParams->dioc_OutBuf,pData1,sizeof(Data));
*pDIOCParams->dioc_bytesret=sizeof(Data);
break;
case 1:
memcpy(pDIOCParams->dioc_OutBuf,pData1,sizeof(Data));
*pDIOCParams->dioc_bytesret=sizeof(Data);
break;
}
*pU=0;
break;
}
return 0;
}
# ECG.mak - makefile for VxD ECG
DEVICENAME = ECG
DYNAMIC = 1
FRAMEWORK = CPP
DEBUG = 1
OBJECTS = ecg.OBJ
!include $(VTOOLSD)\include\vtoolsd.mak
!include $(VTOOLSD)\include\vxdtarg.mak
ecg.OBJ: ecg.cpp ecg.h