DSP

OMAPL138学习---CMEM

2019-07-13 12:57发布


设计 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; iServer_getMemStat(hServer, i, &memStat);
if (strcmp(memStat.name, "DDRALGHEAP") == 0) {
printf("DDRALGHEAP usage is %d out of %d available ",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