myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1803回复:5

PCI9054 block DMA大小没有限制吧?为什么一大就错?

楼主#
更多 发布于:2004-07-15 19:42
用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了,为什么呢???
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-16 15:03
512K Byte用block DMA会不会有问题啊?
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
linjing
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2008-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-20 12:50
请问如果用到64kword大小,会太大吗?
粼粼
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-20 14:51
我也不知道啊,别人都说没有问题,但是我就是做不起来~~~~~~
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
jackywangwen
驱动牛犊
驱动牛犊
  • 注册日期2006-03-14
  • 最后登录2008-04-09
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-06 13:23
没问题,我用到6MB都没问题。我用的DS开发的,你可以把CommonBuffer开的大一些就可以了,如果直接使用Direct_IO方式,我试过不能大于30KB,换成使用CommonBuffer可以。
zhangwei_351286
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2008-01-22
  • 粉丝0
  • 关注0
  • 积分140分
  • 威望15点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-13 00:15
呵呵,最好用commonbuffer方式,把缓冲区申请的大点按照你的要求
最好申请1M,当然DMA每次最大的传数量也改一下,要不然就不行了。
系统最大的申请是64M,当然还是少用为好。
还有用缓冲区方式的话,注意改一下程序及dmaready中,当传输完了,应手动将
数据从commonbuffer中拷贝到用户缓冲区中。见我发过的一个帖子,有详细的代码。
游客

返回顶部