阅读:1088回复:1
为什么中断处理服务会死机
各位大虾,有空来看看,帮帮忙,感激不尽,拜托!!!
我在工作中遇到这样一个问题: 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 程序中,我没有涉及内存的操作,怎么会有这种情况出现呢? |
|
沙发#
发布于:2004-08-07 17:01
我只知道一定是缺页引起的! :cool:
|
|
|