最近做一个东西,需要对很大图像进行jpeg压缩。beagleboard-xm默认分配给cmem和dsp端heap的内存不够用,需要重新分配内存块。看了一下启动脚本和codec server中的内存分配脚本,很快找到了需要修改的地方。
1、首先需要修改的是启动参数
原来的启动参数是:
console=ttyS2,115200n8 noinitrd rw ip=192.168.10.101:192.168.10.100:192.168.10.1:255.255.255.0::usb0:off root=/dev/nfs nfsroot=192.168.10.100:/home/ubuntu/install/dm3730/targetfs,nolock,rsize=1024,wsize=1024
mem=55M@0x80000000
mpurate=1000 omap_vout.vid1_static_vrfb_alloc=y omapfb.vram=0:8M
mem=384M@0x88000000 omapfb.mode=dvi:hd720 omapdss.def_disp=dvi vram=8M rootwait camera=lbcm5m03
其中
mem=384@0x88000000应该是分配给显卡的,omapfb.vram应该是显存吧?呵呵,我没看文档,不敢确定。反正我就盯上这块儿内存了,就从这里划出128M,修改启动参数为:
'console=ttyS2,115200n8 noinitrd rw ip=192.168.10.101:192.168.10.100:192.168.10.1:255.255.255.0::usb0:off root=/dev/nfs nfsroot=192.168.10.100:/home/ubuntu/install/dm3730/targetfs,nolock,rsize=1024,wsize=1024
mem=55M@0x80000000
mpurate=1000 omap_vout.vid1_static_vrfb_alloc=y omapfb.vram=0:8M
mem=256M@0x90000000 omapfb.mode=dvi:hd720 omapdss.def_disp=dvi vram=8M rootwait camera=lbcm5m03'
2、然后修改cmem的内存分配
在嵌入式文件系统里找到/etc/init.d/loadmodule-rc,可以看到这么一段注释:
# Default Memory Map for DM3730 EVM
#
# Start Addr Size Description
# -------------------------------------------
# 0x80000000 55 MB Linux
# 0x83700000 34 MB CMEM
# 0x85900000 39 MB CODEC SERVER
这是默认的内存分配情况,0x80000000起始的55MB对应启动参数中的
mem=55M@0x80000000,0x85900000起始的39MB是留给dsp程序的,划分给CMEM的是0x83700000起始的34MB。具体的分配工作是这个命令执行的:modprobe cmemk phys_start=0x83700000 phys_end=0x85900000 allowOverlap=1
useHeapIfPoolUnavailable=1
刚才不是从显存里剥削了128M内存空间出来么?现在把其中的一半交给cmem管理,也就是说cmem的大小为34+64=98MB,起始地址不变,还是0x83700000,而终止地址修为0x89900000,将脚本中的语句修改为modprobe cmemk phys_start=0x83700000 phys_end=0x89900000 allowOverlap=1 useHeapIfPoolUnavailable=1
3、最后来修改codec server也就是dsp端程序中的内存分配。
刚才说了,原始脚本将0x85900000起始的39MB分配给了dsp。说是“分配”,其实在arm和linux一端不需要任何操作,谁都不用这块儿内存,留给dsp享用就行啦。但是在dsp端就不能当甩手掌柜了,必须配置一下,要在codec server的.tcf文件里,按照现在的内存划分重新分配内存。这个tcf文件,就是单核dsp时代dsp/bios的配置文件,当年在ccs3.3下有图形化配置工具进行操作的。现在搞到linux底下,退化成需要手工编辑的脚本了,呵呵。其实也能图形化配置,需要花钱买ccs5 for
linux版本的license,白花花的银子啊……
我这里的tcf没有直接写内存分配,而是包含了一个memmap.tci,类似.c包含.h,内存就是在这里面分配的。在哪都无所谓,给丫改过来就行啦!算法处理大图像,需要大heap,那么就把剩下的64M内存扔到heap里。也就是说需要修改的有两个内容,一个是dsp程序的起始地址,牵一发而动全身,这个地址变了,每个内存块儿的起始地址都得跟着变,再一个就是heap大小,找到heap的内存块,把那64M扔进去就OK了。
1、2、3都修改完之后,首先要重新编译codec server,然后再重新编译调用codec server的应用程序,都编译通过之后,用新的启动参数启动内核,把codec server和应用程序这俩货都拷贝到文件系统上,运行就OK啦!