您好!我在使用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

