pwhbyx
驱动牛犊
驱动牛犊
  • 注册日期2004-06-15
  • 最后登录2006-12-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1088回复:1

为什么中断处理服务会死机

楼主#
更多 发布于:2004-08-02 18:05
各位大虾,有空来看看,帮帮忙,感激不尽,拜托!!!
  我在工作中遇到这样一个问题:
 B码发生器给PIO144(IO卡)卡提供输入5OOHz的脉冲信号,利用IO卡的中断功能,在每一个脉冲间隙内完成一些相关的运算操作。
 应用程序通过按钮随时控制开始中断处理,随时停止中断处理。

我运用了VXD处理硬件中断的基本框架,并使用了VGlobalEvent类。下面是VXD的基本实现程序

#define DEVICE_MAIN
#include "test.h"
Declare_Virtual_Device(TEST)
#undef DEVICE_MAIN

#include "datapass.h"

PVOID CallBackApc=0;
THREADHANDLE TheThread=0;
MyHwInt* pMyIRQ;

DWORD pio144Base;
int count=18;


void TickHandler(void)
{
 (new realcontrol())->call();
}
MyHwInt::MyHwInt(void(*pCallback)()):VSharedHardwareInt(MY_IRQ,0,0,0)
{
  m_callback=pCallback;
}

MyHwInt::~MyHwInt()
{
 //forceDefaultOwner(MY_IRQ,0);
}
BOOL MyHwInt::OnSharedHardwareInt(VMHANDLE hVM)  //中断处理
{
  
//在中断处理函数中,用运算符new创建派生类的一个实例
  if(m_callback)
  {
    m_callback();
  }
sendPhysicalEOI();
        //deassert(hVM);
return true;
}

TestVM::TestVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}

TestThread::TestThread(THREADHANDLE hThread) : VThread(hThread) {}

BOOL TestDevice::OnSysDynamicDeviceInit()
{
pMyIRQ=new  MyHwInt(TickHandler);    
if(!pMyIRQ||!pMyIRQ->hook())

{   pMyIRQ=0;
return FALSE;
    }
pMyIRQ->physicalUnmask();

VEvent::initEvents();
return TRUE;

}

BOOL TestDevice::OnSysDynamicDeviceExit()
{
if(pMyIRQ) delete pMyIRQ;
dout<<"vxd exit!"<<endl;
return TRUE;
}

DWORD TestDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
switch(pDIOCParams->dioc_IOCtlCode)
{
case DIOC_OPEN:
return 0;
case DIOC_CLOSEHANDLE:
return 0;
   case ADDRPASS: //从应用层接受板卡基地址数据
  pio144Base=*(DWORD*)pDIOCParams->dioc_InBuf;
          //dout<<"base address %x"<<pio144Base<<endl;
           _outp(pio144Base+0x05,0);  //中断被禁止
  return 0;
case PASS:
  CallBackApc=pDIOCParams->dioc_InBuf;
  TheThread=Get_Cur_Thread_Handle();
  return 0;

case ENTERCONTROL:
  _outp(pio144Base+0x2a,1);  //选择反相信号
  _outp(pio144Base+0x05,1);  //使能P2C0,中断被允许
  dout<<"enable interup!"<<endl;
return 0;

case EXITCONTROL:
   _outp(pio144Base+0x05,0); //停止P2C0中断功能

return 0;
default:
return -1;
}
}

realcontrol::realcontrol():VGlobalEvent(0){}
void realcontrol::handler(VMHANDLE hVM,CLIENT_STRUCT * pRegs,PVOID refData)
{
 /* int i=0;
  int j=0;
  dout<<"hahha"<<endl;
  _outp(pio144Base+0xc4,0);
 _outp(pio144Base+0xc0,0x00);
  
  for(i=0;i<400;i++)
    for(j=0;j<400;j++)
  {
  }
  _outp(pio144Base+0xc0,0xff);

  dout<<"good luck"<<endl;*/
  VWIN32_QueueUserApc(CallBackApc, (DWORD)&count, TheThread);
  dout<<"over,try again"<<endl;
  
}

以上程序能够正确编译并生成VXD驱动程序,可是在实际运行时:
 中断操作很不稳定,通过输出可以发现有时能够进入中断,但中断的次数有限(10此左右)(有时根本不能进入中断),然后softICE就会弹出,并报告
 Break due to Page Fault(0eh), fault=0000
   MSR LastExceptionFromIP=c17c17745
     MSR LastExceptionToIP=c17c1774D
寄存器状态为 o d i s z A p C
         DS:00C90F9E=FFFFFFFF
程序中,我没有涉及内存的操作,怎么会有这种情况出现呢?
FutureNow
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2007-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-07 17:01
我只知道一定是缺页引起的! :cool:
有梦才有未来!梦是做出来的!继续做梦,努力工作,享受生活!
游客

返回顶部