阅读:1242回复:0
amcc5933中断处理时间太长导致传输中fifo总满丢数的问题求助!
把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); } |
|
|