This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于66ak2hx读写DDR3性能的问题



您好!我在使用66ak2hx系列处理器的过程中遇到了ddr读写性能过低的问题,希望能得到您的一些帮助指导

相关问题的描述如下:

 

在我们的系统中,DDR3A和DDR3B两个控制器分别连接了1GB的内存,引脚DDR3A_MAP_EN拉高,所以相应的ARM VIEW的内存地址空间应该为

0x60000000 - 0x7fffffff DDR3B

0x80000000 - 0xbfffffff DDR3A

为了将0x60000000 - 0x7fffffff这段内存区域也作为ARM和DSP的共享内存区域,在arch/arm/boot/dts/k2hk.dtsi的dspmem结点中添加了0x60000000 0x20000000,如下

        dspmem: dspmem {

            compatible = "linux,rproc-user";

            mem  = <0x0c000000 0x00600000

                    0x60000000 0x20000000

                    0xa0000000 0x20000000>;

            label = "dspmem";

        };

 

按如下方式对这段内存区域进行内存映射

#define MEM_ADDR 0x60000000

fdm = open("/dev/dspmem", O_RDWR);

virt = mmap(NULL, 0x100000, PROT_READ | PROT_WRITE, MAP_SHARED, fdm, MEM_ADDR);

但实际使用过程中发现对这段内存的读写效率极低,远低于使用malloc分配的内存空间——经测试,后者读速度是前者的20倍,写速度是前者的2倍

 

进行对比的使用malloc分配的内存空间按如下方式分配

virt = malloc(sizeof(uint8_t) * 0x100000);

 

相应的读写代码如下:

void *virt;

for (i = 0; i < 0x100000; i++)

*((uint8_t *)virt + i) = (uint8_t)(i & 0xff);

for (i = 0; i < 0x100000; i++) {

if (*((uint8_t *)virt + i) != (uint8_t)(i & 0xff)) {

printf("unmatch %08x - %02x \n", i, *((uint8_t *)virt + i));

}

}

 

Uboot的环境变量如下

baudrate=115200

bootargs=console=ttyS0,115200n8 rootwait=1 rdinit=/sbin/init rw root=/dev/ram0 initrd=0x802000000,11M

bootcmd=sf probe;sf read 0x0c5f0000 0xd0000 0x10000;sf read 0x87000000 0xe0000 0x10000;sf read 0x88000000 0x100000 0x400000;sf read 0x82000000 0x500000 0xb00000;mon_install 0x0c5f0000;bootm 0x88000000 - 0x87000000

bootdelay=3

bootfile=uImage

debug_options=1

eth1addr=00:17:ea:fd:88:12

ethact=K2HK_EMAC

ethaddr=00:17:ea:fd:88:11

fdt_high=0xffffffff

initrd_high=0xffffffff

ipaddr=172.168.30.196

mem_lpae=1

mem_reserve=512M

no_post=1

serverip=172.168.40.108

stderr=serial

stdin=serial

stdout=serial

ver=U-Boot 2013.01-svn7 (May 28 2015 - 19:49:04)

 

Uboot相应的编译宏见附件autoconf.mk

 

 

使用的内核为从http://git.ti.com/keystone-linux下载的rio-dev-dio分支

仅对arch/arm/boot/dts/k2hk.dtsi做过修改

1)去除arm2-3和dsp4-7对应的结点

2)在dspmem结点中添加了0x60000000 0x20000000

3)在rapidio结点中做了如下修改

baudrate  = <2>;              /* 3.125Gbps */

path_mode = <4>;              /* 1 port in 4x */

ports = <0x1>;      /* port 0 - bitfield of port(s) to probe */

修改后的k2hk.dtsi文件见附件

 

内核使用的配置文件见附件.config