clb6040110331
驱动牛犊
驱动牛犊
  • 注册日期2008-03-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望276点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1833回复:1

关于9054的问题,附代码,关于DPC对于中断的影响

楼主#
更多 发布于:2009-04-11 00:06
下面是我的一部分代码。
请问各位,我用DS开发的驱动,进入DPC之后中断响应函数就收到无数的中断。
也就是说如果驱动中有进入DPC的函数,那么驱动程序就会莫名其妙得收到很多次中断,
如果注释掉DPC,基本上就没有问题,不收到中断。
ULONG INT_NUM =100;

VOID Dma_2_pDevice::DpcFor_Irq(PVOID Arg1, PVOID Arg2)
{

    m_CurrentTransfer->Continue(UseTransferSize);

    KIrp I(CurrentIrp());

    if (!I.IsNull()) {

        I.Status() = STATUS_SUCCESS;

        I.Information() = 0;

        PnpNextIrp(I);
    }
    */
    t <<"int_dpc status, entering the DPC"<<EOL;
    m_IoPortRange0.outd(0x68,0x40900);
    UNREFERENCED_PARAMETER(Arg1);

    UNREFERENCED_PARAMETER(Arg2);

}
BOOLEAN Dma_2_pDevice::Isr_Irq(void)
{
    INT_NUM ++:
    ULONG status;

                      status=m_IoPortRange0.ind(0x68);//read intcsr
 
    t <<"int status, 0x68 read back value is: "<<status<<EOL;

    m_IoPortRange0.outd(INTCSR,0x0f000000);

    if(status&0x200000==0)//if it is not DMA or local interrupt int
    {

        return FALSE;

    }
    else if (status&0x200000==0x200000)//if DMA channel 0 is active
    {
        m_DpcFor_Irq.Request();//added code to tell dpc how to deal with it
    }
    

                     m_IoPortRange0.outb(0xA8,0x08);// Clear Interrupt

    status=m_IoPortRange0.ind(0x68);

    t <<"the INTCSR state is read as: "<<status<<EOL;

    // Return TRUE to indicate that our device caused the interrupt

    return TRUE;
}


如果注释掉m_DpcFor_Irq.Request(),启动计算机后看到INT_NUM 是100,反之,则INT_NUM 是一个不断增加的数值,不知道为什么。
lee922@gmail.co
驱动牛犊
驱动牛犊
  • 注册日期2007-07-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分39分
  • 威望340点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2009-07-27 14:55
KIrp I(CurrentIrp());

    if (!I.IsNull()) {

        I.Status() = STATUS_SUCCESS;

        I.Information() = 0;

        PnpNextIrp(I);
    }
一般在DMA的回调函数里做吧
游客

返回顶部