阅读:1888回复:9
为什么机子会重启动或者死机?
各位同仁,朋友。当我运行我的应用程序调用CreateFile()来打开我的一个PCI板卡时,我的机子会重新启动或者死机,到底怎么回事?帮帮我。谢谢
|
|
最新喜欢:wwengu...
|
沙发#
发布于:2002-03-01 14:15
符号联接名确实存在嘛?驱动程序有问题嘛?
|
|
|
板凳#
发布于:2002-03-01 14:39
符合连接名没有问题(Testdevice0),驱动程序以前也用过呀
|
|
|
地板#
发布于:2002-03-01 14:50
提供的现象太笼统了,最好能有具体的东东,到软件的论坛去提一下,可能有人能提供思路.
|
|
|
地下室#
发布于:2002-03-02 23:39
估计是驱动程序有问题!
在驱动程序里设个断点,然后单步执行,肯定能找到问题出在哪里。 试试吧! |
|
|
5楼#
发布于:2002-03-04 14:43
怎么能给驱动程序设置断点呢?用什么软件吗?我调试驱动程序使用的是驱动程序监视器(即driverworks\\driver monitor)。通过打印一些信息来看驱动程序的执行情况。您有好的方法介绍给我吗?谢谢。
还有,我把驱动程序里(下列)的/*与*/之间的代码已经屏蔽之后可以打开了。那么/*与*/之间的代码到底有什么问题呢?请大侠指教,谢谢! NTSTATUS TestDevice::Create(KIrp I) { NTSTATUS status; /* //Clear LINTi# CNTRL_UL = (ULONG)(ULONG(CNTRL_UL)&0x0FFFEFFFF);//CLR USERO TO CLR LINTi#,使USERO输出为低。 //Delay _asm{ NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; } CNTRL_UL = (ULONG)(ULONG(CNTRL_UL)|0x00010000);//SET USERO,使USERO输出为高。 //Set PCI Write Command Code for DMA to \"Write and Invalid\" CNTRL_UL = (ULONG)(ULONG(CNTRL_UL)|0x000000F0); //Enable DMA0 Done interrupt and LINTi# interrupt INTCSR_UL = (ULONG)(ULONG(INTCSR_UL)|0x00040900); //Enable Local Latency Timer and Local Pause Timer // MARBR_UL = (ULONG)0x002B0000; //Alocate CommonDmaBuffer1 //为dma传输适配器开辟Common Buffer m_CommonDmaBuf1 =new (NonPagedPool) KCommonDmaBuffer(&m_DmaAdapter,BUFFER_SIZE,FALSE); DMA_VirtualAddress = (PUSHORT)m_CommonDmaBuf1->VirtualAddress(); //总线主模式使用逻辑地址给buffer写数据,仅低32位有用 DMA_LogicalAddress = m_CommonDmaBuf1->LogicalAddress(); if (!DMA_VirtualAddress) return STATUS_UNSUCCESSFUL; // DbgPrint(\"DMA_VirtualAddress : %x\\n\",DMA_VirtualAddress); // DbgPrint(\"DMA_LogicalAddress : %x\\n\",DMA_LogicalAddress.LowPart); //从非分页池中开辟的内存是被锁定的. TheMdl = new (NonPagedPool) KMemory(DMA_VirtualAddress, BUFFER_SIZE);//使用虚拟地址空间创建新的MDL TheMdl->LockPages(IoModifyAccess,KernelMode);//锁存储器。 UserSpaceAddress = TheMdl->MapToUserSpace();//映射。 // DbgPrint(\"User Space Address :%x\\n\",UserSpaceAddress); //DMA硬件使用逻辑地址。 SliceLogicalAddress[0][0] = DMA_LogicalAddress.LowPart; // DbgPrint(\"SliceLogicalAddress[0][0] :%x\\n\",SliceLogicalAddress[0][0]); SliceLogicalAddress[0][1] = DMA_LogicalAddress.LowPart+SLICE_SIZE; // DbgPrint(\"SliceLogicalAddress[0][1] :%x\\n\",SliceLogicalAddress[0][1]); SliceLogicalAddress[0][2] = DMA_LogicalAddress.LowPart+2*SLICE_SIZE; // DbgPrint(\"SliceLogicalAddress[0][2] :%x\\n\",SliceLogicalAddress[0][2]); SliceLogicalAddress[0][3] = DMA_LogicalAddress.LowPart+3*SLICE_SIZE; // DbgPrint(\"SliceLogicalAddress[0][3] :%x\\n\",SliceLogicalAddress[0][3]); SliceLogicalAddress[1][0] = DMA_LogicalAddress.LowPart+4*SLICE_SIZE; // DbgPrint(\"SliceLogicalAddress[1][0] :%x\\n\",SliceLogicalAddress[1][0]); SliceLogicalAddress[1][1] = DMA_LogicalAddress.LowPart+5*SLICE_SIZE; // DbgPrint(\"SliceLogicalAddress[1][1] :%x\\n\",SliceLogicalAddress[1][1]); SliceLogicalAddress[1][2] = DMA_LogicalAddress.LowPart+6*SLICE_SIZE; // DbgPrint(\"SliceLogicalAddress[1][2] :%x\\n\",SliceLogicalAddress[1][2]); SliceLogicalAddress[1][3] = DMA_LogicalAddress.LowPart+7*SLICE_SIZE; // DbgPrint(\"SliceLogicalAddress[1][3] :%x\\n\",SliceLogicalAddress[1][3]); CurrentLogicalAddress = SliceLogicalAddress[0][0]; */ PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(I); t << \"Create File is, \" << &(IrpStack->FileObject->FileName) << EOL; status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT); t << \"TestDevice::Create Status \" << (ULONG)status << EOL; return status; } |
|
|
6楼#
发布于:2002-03-05 10:50
朋友好,经过判断,我发现当执行上面所切程序的如下语句时死机。
//Enable DMA0 Done interrupt and LINTi# interrupt INTCSR_UL = (ULONG)(ULONG(INTCSR_UL)|0x00040900); 我使用的是PCI9080芯片,我在程序中是这样定义它的: KMemoryRange m_Registers; KMemoryRegister INTCSR_UL; INTCSR_UL = m_Registers[0x0068]; 但是其他寄存器也是这样定义和使用的。比如: KMemoryRegister CNTRL_UL; CNTRL_UL = m_Registers[0x006C]; CNTRL_UL = (ULONG)(ULONG(CNTRL_UL)|0x00010000); 当执行它时没有问题呀,到底怎么回事?请各位朋友帮忙,好吗? |
|
|
7楼#
发布于:2002-03-08 16:20
用driverworks开发,你没有softice??
我不知道你观察定位得准不准,是用softice调试到这句话死的吗? 如果真是这句话有问题,你最好检查一下你m_Registers初始化是否正确。 status = m_MemoryRange1.Initialize( pResListTranslated, pResListRaw, //参数根据PCI的配置而定,注意一下这个number PciConfig.BaseAddressIndexToOrdinal(1) ); |
|
|
8楼#
发布于:2002-03-08 16:39
你好,我确信使计算机死机的这个语句是:我对PCI9080的中断控制、状态寄存器(INTCSR)同时设置Pci中断使能位(INTCSR[8])和PCI本地中断使能位(INTCSR[11])时,计算机死机或者重起。具体如何设置这个标志位,就是我前面切的程序。
|
|
|
9楼#
发布于:2002-03-08 17:25
NTSTATUS PSCDevice::OnStartDevice(KIrp I)
{ ... ... Plx9054PciInterruptEnable(); ... ... } bool PSCDevice::Plx9054PciInterruptEnable() { t << \"EnteringDevice::Plx9054PciInterruptEnable\\n\"; ULONG RegInterrupt; ULONG EanbleInt = 0; EanbleInt = (1 << 8) | (1 << 11); RegInterrupt = m_MemoryRange0.ind(PCI9054_INT_CTRL_STAT); m_MemoryRange0.outd(PCI9054_INT_CTRL_STAT,EanbleInt|RegInterrupt); return TRUE; } 我是放在这里初始化的,我刚才说的地方你检查了吗?? |
|
|