Over
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1242回复:0

amcc5933中断处理时间太长导致传输中fifo总满丢数的问题求助!

楼主#
更多 发布于:2001-11-01 11:33
把fifo策略改了(4+full -> 0)以后,机器不死了。
而且多高的速度都支持。。。。只是每次传输完成后fifo就会满150微秒左右。这样导致数据严重丢失。
按理说中断处理和延时处理例程不应该这么慢才对,下面是传输完成后到启动下一次传输中的关键代码,请大虾帮忙找找慢的原因:dpc()
{
    //
    //完成当前DMA传输完成的irp
    //
    baseVa = (PUCHAR)MmGetMdlVirtualAddress(irp->MdlAddress)+devExt->ReadStartingOffset;

    IoFlushAdapterBuffers(devExt->ReadAdapter,
                          irp->MdlAddress,
                          devExt->ReadMapRegBase,
                          baseVa,
                          devExt->ReadSoFar-devExt->ReadStartingOffset,
                          FALSE);

    IoFreeMapRegisters(devExt->ReadAdapter,
                          devExt->ReadMapRegBase,
                          devExt->MapRegsThisRead);

    irp->IoStatus.Information = devExt->ReadTotalLength;
    irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(irp, IO_NO_INCREMENT);    


    //
    //开始队列中下一个irp的DMA传输
    //
    devExt->CurrentReadIrp = 队列中下一个irp;

    KeFlushIoBuffers(Irp->MdlAddress, TRUE, TRUE);

    mapRegsNeeded =
        ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(Irp->MdlAddress),ioStack->Parameters.Read.Length);
        
    devExt->MapRegsThisRead = ((mapRegsNeeded > devExt->ReadMapRegsGot) ?
                              devExt->ReadMapRegsGot : mapRegsNeeded);

    IoAllocateAdapterChannel(devExt->ReadAdapter,
                             DeviceObject,
                             devExt->MapRegsThisRead,
                             OsrAdapterControlRead,  <--分配成功后的回调函数
                             Irp);
}

OsrAdapterControlRead()
{
    baseVa = (unsigned char *)MmGetMdlVirtualAddress(irp->MdlAddress);

    devExt->ReadPaToDevice = IoMapTransfer(devExt->ReadAdapter,
                                   irp->MdlAddress,
                                   MapRegisterBase,
                                   baseVa+(devExt->ReadSoFar),
                                   &devExt->ReadLength,
                                   FALSE);

    (VOID)KeSynchronizeExecution(devExt->InterruptObject,
                            OsrStartReadOnDevice,
                            DeviceObject);
}

OsrStartReadOnDevice()
{
    WRITE_PORT_ULONG(devExt->AmccBaseRegisterAddress+MWAR_OFF, devExt->ReadPaToDevice.LowPart);
    WRITE_PORT_ULONG(devExt->AmccBaseRegisterAddress+MWTC_OFF, devExt->ReadLength);

    temp = READ_PORT_ULONG(devExt->AmccBaseRegisterAddress+ICSR_OFF);

    temp &= ~AMCC_INT_ACK_BITS;
    temp |= AMCC_INT_INT_ON_WRITE;
    
    WRITE_PORT_ULONG(devExt->AmccBaseRegisterAddress+ICSR_OFF, temp);
    WRITE_PORT_ULONG(devExt->AmccBaseRegisterAddress+MCSR_OFF, AMCC_MCSR_WRITE_ENABLE | AMCC_MCSR_ATOP_RESET);
}
当我们仰望星空,其实是在回顾历史
游客

返回顶部