一个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
...全文
83 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
TangZH002 2003-10-17
  • 打赏
  • 举报
回复
up
5w1h 2003-10-15
  • 打赏
  • 举报
回复
有没有人知道啊?
自己up 一下。。。。

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧