OMAPL138学习---CMEM


设计 Memory Map

增加Linux的内存量以提高系统的整体性能

total memory= DSP server memory + CMEM memory + Linux Memory

所以我们要做的就是尽量减少 DSP server 和 CMEM的内存量,只分配必需的量,以增加linux的内存。

DSP server 有四部分

1、两个小的系统段,DSPLINKMEM 和 RESETCTRL 总共大小为 1MB

2、一个中等大小的部分,DDR ,大小为 1~3MB ,包含代码和静态数据

3、一个大的部分,DDRALGHEAP ,大小为2~200MB,包含所有DSP端运行代码动态分配的内存


决定 DDRALGHEAP 的大小

其DDRALGHEAP 大小由codec的类型所决定。

1、可以通过 Engine_getUsedMem() API 来测量 DDRALGHEAP 的大小,在ARM 应用程序中,在第一次调用Engine_open()后立即调用Engine_getUsedMem(),在创建最大的codec后再调用Engine_getUseMem(),其增量就大抵是DDRALGHEAP的大小,略比DDRALGHEAP大几KB。

2、通过Server_getMemStat() 函数来决定DDRALGHEAP的大小,这种方法需要在Codec Engine 1.2 的版本以后才行。

     假定其 codec enging handle 是 hEngine,在峰值负载下使用如下方法:

hServer = Engine_getServer(hEngine);
Server_getNumMemSegs(hServer, &numSegs);


for (i=0; i<numSegs; i++) {
Server_getMemStat(hServer, i, &memStat);
if (strcmp(memStat.name, "DDRALGHEAP") == 0) {
printf("DDRALGHEAP usage is %d out of %d available\n",memStat.size, memStat.used);
}
}


决定DDR 的大小

通过linker map 来简单计算DDR的大小,步骤如下:

1、添加所有你想要加入的 codec 到你的 DSP server 里

2、建立(build)你的 DSP server

3、查看生成的 .map 文件 ,看 DDR 需要多大的空间, .map 文件在 package/cfg 目录下。

4、最终大小比 .map 文件下已使用的大小大一点点


确定和划分 CMEM 内存

有个需要的配置的:

1、确定 ARM 和 DSP 交换缓冲区的大小,这个大小就是 CMEM 的大小

2、知道的确切的 ARM 和 DSP 交换缓冲区的大小,可使把 CMEM 分割为很多缓冲池

通过 cat  /proc/cmem 来查看 CMEM 的详细信息,以此来进一步精确 cmem 缓冲池的划分


把这些内存进行正确的顺序划分

1、确定你的系统总共的内存

2、 把 RESETCTRL 段放到最高地址处,大小为 1MB

3、把 DPLINKMEM 段紧随其后,大小为 1MB ~128B 

4、把 DDR 放到 RESETCTRL 之前 ,使其大小为 4KB的倍数

5、把 DDRALGHEAP 放到 DDR 之前

6、把 CMEM 放到 DDRALGHEAP 之前

7、剩下部分划分给 Linux

最好把内存中的最后 1MB 空间划给 RESETCTRL 和 DSPLINKMEM


最后的结果有可能是这样:




根据你的 DSPLINK 版本来确定重新编译的部分。

具体配置及例程请见Mastering the Art of Memory Map Configuration for Systems.PDF

猜你喜欢

转载自blog.csdn.net/zxycele/article/details/21795547