阅读:1803回复:5
PCI9054 block DMA大小没有限制吧?为什么一大就错?
用DS实现block DMA~~~
-------------------------------------------------------- //初始化 m_CurrentTransfer->Initiate( I.Mdl(), (I.MajorFunction() == IRP_MJ_WRITE) ? FromMemoryToDevice : FromDeviceToMemory, LinkTo(OnDmaReady) ); //回调 VOID DMA9054Device::OnDmaReady(KDmaTransfer* pXfer, KIrp I) { if (pXfer->BytesRemaining() == 0) { pXfer->Terminate(); 。。。。。。。 return; } while (pXfer->SequenceTransferDescriptors(&ptd)) {} if ((ULONG) pXfer->BytesRemaining() == I.ReadSize()) StartDMA(。。。); } //中断 中断中用 m_CurrentTransfer->Continue(UseTransferSize); 结果呢,如果传输的数据一大,我用到的DMA区要求512K,就会有page fault了,为什么呢??? |
|
|
沙发#
发布于:2004-07-16 15:03
512K Byte用block DMA会不会有问题啊?
|
|
|
板凳#
发布于:2004-07-20 12:50
请问如果用到64kword大小,会太大吗?
|
|
|
地板#
发布于:2004-07-20 14:51
我也不知道啊,别人都说没有问题,但是我就是做不起来~~~~~~
|
|
|
地下室#
发布于:2007-04-06 13:23
没问题,我用到6MB都没问题。我用的DS开发的,你可以把CommonBuffer开的大一些就可以了,如果直接使用Direct_IO方式,我试过不能大于30KB,换成使用CommonBuffer可以。
|
|
驱动牛犊
|
5楼#
发布于:2007-04-13 00:15
呵呵,最好用commonbuffer方式,把缓冲区申请的大点按照你的要求
最好申请1M,当然DMA每次最大的传数量也改一下,要不然就不行了。 系统最大的申请是64M,当然还是少用为好。 还有用缓冲区方式的话,注意改一下程序及dmaready中,当传输完了,应手动将 数据从commonbuffer中拷贝到用户缓冲区中。见我发过的一个帖子,有详细的代码。 |