Bigmouse
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5885回复:15

WinDriver的DMA地址访问

楼主#
更多 发布于:2003-06-20 08:11
    本人利用WinDriver的DMA申请函数WD_DMAlock()申请了256*600大小的DMA地址空间,设输出的的用户级地址为pUserAddr,作为对比,开辟了两块大小均为256*600的内存空间,设分别为aAddr、bAddr,现有如下两条语句均执行1000次及其时间:
    memcpy(aAddr,pUserAddr,256*800);    13秒
    memcpy(aAddr,bAddr    ,256*800);    1秒
    有办法让第一条语句的速度尽量减少吗?

最新喜欢:

wwenguangwwengu...
carryxt
驱动牛犊
驱动牛犊
  • 注册日期2001-09-21
  • 最后登录2009-01-27
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-22 19:48
    我也遇到这样的问题,把DMA.pUserAddr中的数据COPY到aAddr时,速度只有20MBYTE,但把aAddr中的数据COPY到DMA.pUserAddr时,速度有60MBYTE,我用WD_Transfer函数在aAddr和DMA.pUserAddr之间传输数据,情况没有改善,我也用了KERNEL PLUGIN,情况依然没有改善.我想这是不是WINDRIVER自身的瓶颈.

[编辑 -  7/22/03 by  carryxt]
Bigmouse
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-23 07:42
http://www.jungo.com/support/faq.html#lfc6007. As explained in the FAQ, DMA buffers should generally be locked as non-cached, to ensure safe access (this is not dictated by WinDriver), and access to non-cached memory is slower. For Contiguous Buffer DMA it is possible to use the DMA_ALLOW_CACHE flag to lock a cached DMA buffer on Win2k/XP for faster access (see the above FAQ as well as section A.2.12 of the manual), however we do not recommend doing so, since you run the risk of memory corruption. This is true for both the evaluation and registered WinDriver version, both for v6.00 and for the latest 6.02 version (as well as earlier versions).
green_pine
驱动太牛
驱动太牛
  • 注册日期2002-10-22
  • 最后登录2019-06-10
  • 粉丝3
  • 关注0
  • 积分48分
  • 威望599点
  • 贡献值1点
  • 好评度144点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-07-23 08:11
我也遇到过类似的问题,不过看了Bigmouse的帖子,总算明白了,看来用windriver是没有办法了
Bigmouse
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-23 08:23
有办法啊!不要胡乱指责WINDRIVER!
    我用WINDRIVER的DMA_ALLOW_CACHE已经解决了,虽然不被推荐,但我用到现在没发现问题;另外,用离散的DMA也可以解决问题,不过硬件成本稍微高一点。
green_pine
驱动太牛
驱动太牛
  • 注册日期2002-10-22
  • 最后登录2019-06-10
  • 粉丝3
  • 关注0
  • 积分48分
  • 威望599点
  • 贡献值1点
  • 好评度144点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-07-23 08:30
这不是指责的问题,看你的口气好像是windriver的销售人员
虽然可以用DMA_ALLOW_CACHE解决,但是正像文档上说的,是有risk of memory corruption,你用着没有问题,难道你能保证做成产品交到客户那里也没问题,如果你只是做个实验那就算了,产品和实验品是完全不同的
Bigmouse
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-23 08:54
    green_pine的严谨作风让人由衷敬佩!
    但我认为内存冲突只有在程序设计人员可能对DMA区域的同一地址同时读写才会发生,这一点可由程序员控制,而操作系统应该不会在没有指令的情况下冒昧访问到DMA区域,如果我的看法不对,请指教。
    需要说明,我不是什么WINDRIVER的销售人员,但我也不会轻易贬低它。
green_pine
驱动太牛
驱动太牛
  • 注册日期2002-10-22
  • 最后登录2019-06-10
  • 粉丝3
  • 关注0
  • 积分48分
  • 威望599点
  • 贡献值1点
  • 好评度144点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-07-23 09:13
对于产品的稳定性,不同的产品有不同的要求,windows的bug很多,但是用它的人还是非常的多,可是银行不会用,为什么?因为对产品稳定性的要求不同。如果你的产品用在普通的场合可能出点差错没有问题,但是如果使用在像银行这样的场合就要多考虑了。
对于稳定性要求很高的产品,“应该没有问题”是不行的
Bigmouse
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-23 09:37
    我们用的就是WINDOWS,它的BUG是另外一回事了。    
    不过GREEN_PINE对高性能产品的担忧确实不无道理。
carryxt
驱动牛犊
驱动牛犊
  • 注册日期2001-09-21
  • 最后登录2009-01-27
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-23 10:26
下面是我向WINDRIVER的提问:
>Hi,
>     DWORD *my_pGetAddr=malloc(0x400000*sizeof(DWORD));
>
>     BZERO(dma);
>         dma.pUserAddr = NULL;
>         dma.dwBytes = 16*4096;  // allocate 64K
>         dma.dwOptions = DMA_KERNEL_BUFFER_ALLOC; // kernel contiguous
> buffer
>         WD_DMALock(hWD, &dma);
>
>      start=clock();
>      for(n=0;n<260;n++)
>      {
>              for(m=0;m<16384;m++)
>              {
>              *(my_pGetAddr+m)=*(dma.pUserAddr+m);
>              }
>      }
>      end=clock()-start;
>
>      start=clock();
>      for(n=0;n<260;n++)
>      {
>              for(m=0;m<16384;m++)
>              {
>              *(dma.pUserAddr+m)=*(my_pGetAddr+m);
>              }
>      }
>      end=clock()-start;
>
>         when i transfer 16Mbytes from  \"dma.pUserAddr\"
> to  \"my_pGetAddr\",it uses about 1 sec.(end =1000).
>but  when i transfer 16Mbytes from  \"my_pGetAddr\" to  \"dma.pUserAddr\",it
>uses about 0.2 sec.(end =200).
>Why does transfering data from  \"dma.pUserAddr\" to  \"my_pGetAddr\" cost a
>so long time?
carryxt
驱动牛犊
驱动牛犊
  • 注册日期2001-09-21
  • 最后登录2009-01-27
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-23 10:30
ANSWER:
I am not really sure what is the reason for the time differences you have
monitored, but it does not seem to be directly related to anything done by
WinDriver. A possible explanation might be that the my_pGetAddr memory is
being cached when you perform a read - which naturally makes the transfer
faster, but cannot be cached in the case of a write, and is therefore
slower when you write to this memory.
carryxt
驱动牛犊
驱动牛犊
  • 注册日期2001-09-21
  • 最后登录2009-01-27
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-23 10:36
除了用DMA_ALLOW_CACHE标志,和集散DMA,可以提高性能外,直接用DDK的函数锁住连续的不可缓存的页,进行BLOCK DMA,性能会不会提高。
carryxt
驱动牛犊
驱动牛犊
  • 注册日期2001-09-21
  • 最后登录2009-01-27
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-07-23 10:44
请问:对不支持集散DMA的PCI接口芯片,如S5933、C6215中的PCI模块,最大的DMA传输速率可达多少。

[编辑 -  7/23/03 by  carryxt]
Bigmouse
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-07-23 10:48
    直接用DDK的函数锁住连续的不可缓存的页,性能应该稍好一点(那要看使用DDK的水平,因WINDRIVER工作在用户界面),但肯定远远赶不上用DMA_ALLOW_CACHE标志或离散DMA的速度。
Bigmouse
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2003-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-07-23 10:56
S5933、C6215我没有研究,但我的不支持离散DMA的PCI接口芯片
CY7C09449可达80M
yanyan3fish
驱动牛犊
驱动牛犊
  • 注册日期2010-01-05
  • 最后登录2010-01-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2010-01-05 15:20
大家的讨论对我非常有意义,我也想使用windriver开发PCI驱动程序,真诚希望和大家取得联系。
email:yanyan3fish@126.com
qq:81967858
Windriver 开发pci驱动
游客

返回顶部