previous
驱动牛犊
驱动牛犊
  • 注册日期2002-07-02
  • 最后登录2003-01-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1610回复:3

为什么中断服务程序只能进一次?????????

楼主#
更多 发布于:2002-07-03 22:55
各位大侠,小弟在写一个驱动时,发现我的中断服务程序只能进入一次.去掉KeInsertQueueDpc时就能正常.但我想在DPC里都数据.


status = IoConnectInterrupt(&pdx->pInterruptObject,
                OnInterrupt,pdx,NULL,vector,
                IrqL,IrqL,mode,irqshare,affinity,FALSE);

KeInitializeDpc(&(pdx->ReadDataDPC),ReadDataDPC,pdx);


BOOLEAN
OnInterrupt(
    PKINTERRUPT pInterrupt,
    PVOID       pdx
    )
{
    U32 RegPciInt;
    U32 InterruptSource;
U8   i,Int1510Temp;
DEVICE_EXTENSION *pdx1;

pdx1 = (DEVICE_EXTENSION *)pdx;

    // Read interrupt status register
    RegPciInt =
        PLX_REG_READ(
            (DEVICE_EXTENSION *)pdx,
            PCI9030_INT_CTRL_STAT
            );

    // Check for master PCI interrupt enable
    if ((RegPciInt & (1 << 6)) == 0)
        return FALSE;

    // Verify that an interrupt is truly active
i = 0;
{
Int1510Temp = Read1510(pdx1 , i , 0x0d);
if((Int1510Temp&0xff) != 0x00)
{
if((Int1510Temp&0x02) == 0x02)
{
if(pdx1->bStartRecFlag == 1)
{
KeInsertQueueDpc(&(((DEVICE_EXTENSION *)pdx)->ReadDataDPC),NULL,NULL);
}
}
pdx1->bIntService = Int1510Temp;
pdx1->bIntTimes++;
if(pdx1->bIntTimes > 0xfffff0)
pdx1->bIntTimes = 0;
Int1510Temp = Read1510(pdx1,i,0x0e);
}
}

    return TRUE;
}

VOID ReadDataDPC(
    IN PKDPC Dpc,
    IN PVOID DeferredContext,
    IN PVOID SystemArgument1,
    IN PVOID SystemArgument2
    )
{
U32  j;
U8   i,temp;
    DEVICE_EXTENSION *pdx;


    pdx = (DEVICE_EXTENSION *)DeferredContext;

i=0;
{
if(pdx->bStartRecFlag == 1)
{
if((pdx->bIntService&0x02) == 0x02)
{
(PUSHORT)(pdx->PciBar[i+2].pVa) = 0x00;
for( j=0; j<256;  j++ )
                {
temp = (U8)*(pdx->PciBar[i+2].pVa + 1);
}
}
}
}

}
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-07-04 16:04
你在中断调用DPC使用KeInsertQueueDpc函数,不知道和调用IoRequestDpc()函数有什么区别?
是不是KeInsertQuesueDpc能够确保相同的Dpc例程能够被加入队列中去?

 

KeInsertQuesueDpc一般用于维护自己的DPC队列
lonkiss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2004-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-04 15:35
你在中断调用DPC使用KeInsertQueueDpc函数,不知道和调用IoRequestDpc()函数有什么区别?
是不是KeInsertQuesueDpc能够确保相同的Dpc例程能够被加入队列中去?

我的真名就叫-龙旗
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-07-04 11:26
用户被禁言,该主题自动屏蔽!
游客

返回顶部