66ak2h12芯片,自己的单板,有两块内存,一个是2G,一个是8G, DDR3A_REMAP_EN 管教应该是悬空的,内部下拉。
系统启动后,显示的/proc/iomem(内存部分如下):
80000000-9fffffff : System RAM (boot alias)
a0000000-afffffff : pcie_mem
b0000000-b7ffffff : System RAM (boot alias)
f0000000-ffffffff : System RAM (boot alias)
800000000-81fffffff : System RAM
800008000-80092f023 : Kernel code
80097c000-800a0d143 : Kernel data
830000000-837ffffff : System RAM
838000000-86fffffff : CMEM
870000000-8ffffffff : System RAM
980000000-99fffffff : CMEM
9a0000000-9ffffffff : System RAM
测试20kB数据通过memcpy拷贝速率,测试结果如下,如果通过mmap映射2G DDR,则拷贝速率非常慢,而malloc两块内存的拷贝非常快,请问什么原因?测试结果如下:另外,拷贝数据到2G DDR似乎也比较快。
mmap /dev/mem内存的地址为0xd0000000,在下面的测试结果中为fmem
root@k2hk-evm:~# ./memmemP1 addr = 0xb6fd2000!
memP2 addr = 0xb6fcc000!
mallocP1 addr = 0x00021008!
mallocP2 addr = 0x00026010!
memcpymalloc -> fmem!
i = 100000, blocksize = 20480, dur = 3(s) 163514(us)!
memcpyfmem -> malloc!
i = 100000, blocksize = 20480, dur = 92(s) 300060(us)!
memcpymalloc -> malloc!
i = 100000, blocksize = 20480, dur = 0(s) 254845(us)!
memcpyfmem -> fmem!
i = 100000, blocksize = 20480, dur = 183(s) 6233(us)!
由于单板作为PCIe EP把PCIe地址空间映射到2G DDR,所以这个性能是不够的,请问,这个问题是如何造成的?
这里是采用sdk附带的例程edmabw运行后的结果,请问这个测试结果是否有问题
Single channel EDMA bandwidth measured in GB/s
==============
From DSP Core: 0 1 2 3 4 5 6 7
==============
ddr => ddr : 0.030 0.030 0.048 0.047 0.042 0.042 0.048 0.047
ddr => msmc : 0.104 0.111 0.124 0.123 0.126 0.125 0.128 0.127
ddr => l2 : 0.105 0.112 0.130 0.129 0.130 0.129 0.130 0.129
msmc => ddr : 0.049 0.049 0.078 0.079 0.077 0.077 0.079 0.079
msmc => msmc : 0.293 0.295 0.294 0.295 0.295 0.295 0.468 0.462
msmc => l2 : 0.295 0.296 0.296 0.296 0.296 0.296 0.297 0.295
l2 => ddr : 0.049 0.050 0.081 0.080 0.080 0.080 0.081 0.082
l2 => msmc : 0.294 0.296 0.295 0.295 0.296 0.296 0.296 0.295
l2 => l2 : 0.278 0.279 0.279 0.280 0.295 0.295 0.279 0.277
Thomas Yang1:
请问您是怎么映射fmem空间的,有没有使能cache?malloc空间是哪个地址?
另外PCIE空间传输的话,肯定是通过EDMA进行的,那么您做的memcpy测试是否有意义呢?
xs wan:
回复 Thomas Yang1:
系统运行的Linux4.4.41,在Linux系统下,采用mmap /dev/mem的方式映射的fmem,映射地址为0xA8000000,malloc直接调用的,没有制定参数。请问,如何在malloc时指定地址,而且在K2HK中,如何指定DDR3A呢,其地址为0x800000000~0x9FFFFFFFF,或者mmap的时候如何指定采用DDR3A。
请问,如何开cache?
还有,为什么PCIE空间就是EDMA传输呢?好像直接采用memcpy也是可以的,ARM端。
在我的应用中,我是采用的openmpacc例程中的EdmaMgr_copy1D1D()传输的(outbound,从内存往0x50000000拷贝数据),也存在一个问题,就是如果每次发送的数据比较小,如20K左右,则PCIe传输30MB/s左右,但是在1MB数据时,速率可以到300MB/s。并且如果每次发送的数据更大,则速率也有降低。
另外,我的应用中需要通过PCIe获取数据,多个数据源(10个左右),每个数据源每次的数据在20KB左右,但是总的数据速率在100MB/s左右,请问,是否可以通过单核EDMA方式实现数据接收?
xs wan:
回复 xs wan:
再请教一个问题,在TI资料中,看到如下库函数:
EdmaMgr_copy1D1DLinked()
请问,这个函数是否可以通过多个edma通道同时传输多组数据?