wdm8000
驱动牛犊
驱动牛犊
  • 注册日期2001-06-07
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1888回复:9

为什么机子会重启动或者死机?

楼主#
更多 发布于:2002-03-01 10:24
各位同仁,朋友。当我运行我的应用程序调用CreateFile()来打开我的一个PCI板卡时,我的机子会重新启动或者死机,到底怎么回事?帮帮我。谢谢

最新喜欢:

wwenguangwwengu...
吴新安
jst7792
论坛版主
论坛版主
  • 注册日期2001-12-10
  • 最后登录2006-11-16
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-01 14:15
符号联接名确实存在嘛?驱动程序有问题嘛?
兄弟们,给点分吧
wdm8000
驱动牛犊
驱动牛犊
  • 注册日期2001-06-07
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-01 14:39
符合连接名没有问题(Testdevice0),驱动程序以前也用过呀
吴新安
jst7792
论坛版主
论坛版主
  • 注册日期2001-12-10
  • 最后登录2006-11-16
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-01 14:50
提供的现象太笼统了,最好能有具体的东东,到软件的论坛去提一下,可能有人能提供思路.
兄弟们,给点分吧
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-02 23:39
估计是驱动程序有问题!
在驱动程序里设个断点,然后单步执行,肯定能找到问题出在哪里。
试试吧!
神仙?妖怪? 谢谢!
wdm8000
驱动牛犊
驱动牛犊
  • 注册日期2001-06-07
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;
}
吴新安
wdm8000
驱动牛犊
驱动牛犊
  • 注册日期2001-06-07
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);
当执行它时没有问题呀,到底怎么回事?请各位朋友帮忙,好吗?
吴新安
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-03-08 16:20
用driverworks开发,你没有softice??
我不知道你观察定位得准不准,是用softice调试到这句话死的吗?
如果真是这句话有问题,你最好检查一下你m_Registers初始化是否正确。

status = m_MemoryRange1.Initialize(
pResListTranslated,
pResListRaw,
         //参数根据PCI的配置而定,注意一下这个number
PciConfig.BaseAddressIndexToOrdinal(1)
);
神仙?妖怪? 谢谢!
wdm8000
驱动牛犊
驱动牛犊
  • 注册日期2001-06-07
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-03-08 16:39
你好,我确信使计算机死机的这个语句是:我对PCI9080的中断控制、状态寄存器(INTCSR)同时设置Pci中断使能位(INTCSR[8])和PCI本地中断使能位(INTCSR[11])时,计算机死机或者重起。具体如何设置这个标志位,就是我前面切的程序。
吴新安
wangbo
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2002-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;
}

我是放在这里初始化的,我刚才说的地方你检查了吗??
神仙?妖怪? 谢谢!
游客

返回顶部