视频这块的工作都快一年多了。发现在自己还是那么多菜。继续努力。言归正传。
由于我们用的是三星的s5p6443芯片(其实就是阉割版的6440或者s5p6410),没有camera的接口,但我们公司的做的gps设备基本都需要AVIN功能,主要用来做倒车镜功能来用。所以我一们一直采用s5p6443+fpga+tvp5150的架构来做avin的功能。其实,基本工作原理就是,tvp5150将标准的模拟信号(NTSC/PAL/SECAM制式)转换为YCBCR数字信号后,送给fpga,fpga再将其转为RGB565的数据,然后再将数据打包,以sd协议,发给s5p6443。
由于cpu收到的数据是,打过包的数据,也就是有包头的。就像tcp/ip的数据,在网络上传输是有20个字节ip包头。呵呵。所以我们,avin的驱动,就需要在接受到数据后,将其解包,然后奇偶场数据合并成一帧,在再经过post放缩到合适的大小在送到framebuffer来显示。
这种架构,有一个很大的问题就是,cpuloading太高,对小的屏,基本还能接受,但是大屏就不行了。在我们4.3寸的屏上,avin的loading就将近55%。
最近老大们,一直让我们的avin的驱动,要把loading给将下来。这可头疼死我们了。
首先,为了降cpu的loading,我先分别测试了一下,avin整个功能模块上,各个模块所耗费的cpuloading。最后发现,整个cpuloading的主要耗费在数据解包和内存数据搬运中,特别是内存数据搬运。因为一阵数据,很大,而我们的数据包只能512byte大小(这个主要受sd协议所限制)。所以在原来解一帧数据的时候,每一帧数据,有1300多个数据包,那么就是一帧数据我们要调用1300多次memcpy函数,按照NTSC制式每秒30帧,那就是一秒光解包这块的调用40000多次的memcpy函数。汗啊,怪不得cpuloading高啊。
找到了原因所在,这下就好办了。呵呵。以前,在学校的时候,只是从书本上学到,说嵌入式的系统,在一些很关键的地方用汇编写,主要是为了,提高cpu的利用率。呵呵,没想到,这次我们尝试了一下,真的很猛啊。
我们将原来在我们avin驱动中标准的memcpy()函数,替换成了用我们自己实现用汇编所实现的一个功能函数。这下好了,cpuloading,一下子。降下来了。整个系统loading不到30%。呵呵。
其实,我们的自己实现的类memcpy函数,主要是去掉了,很多参数类型检查,边界检查等代码。用尽可能的arm寄存器去做数据内存对拷。呵呵。