首页 > 代码库 > 关于DM8168中移植算法速度慢、效率低的新发现
关于DM8168中移植算法速度慢、效率低的新发现
有不少的朋友,特别是刚刚接触DSP的朋友,基于DVRRDK编写C代码发现运行速度特别慢,我在上面简单的对每个像素的UV分量赋值=0x80,这样就成了灰度图像,对1080P图像进行操作,发现处理每帧要耗时10-20ms,真是慢的不可思议。
最近将SWOSD的完整代码看了一遍发现了玄机。
主要问题是在DDR中读写数据拖慢了速度。
经测试SWOSD进行一帧D1的叠加仅需要400us(叠加大小大概208*32*3个窗口);
仔细分析,其内部使用了基于内部 IALG_DARAM0(双通片上数据存储)的乒乓缓存结构:
Int SWOSD_TI_alloc(const IALG_Params *algParams, IALG_Fxns **pf, IALG_MemRec memTab[]) { const SWOSD_Params *params = (SWOSD_Params *)algParams; memTab[0].size = sizeof(SWOSD_TI_Obj); memTab[0].alignment = 0; memTab[0].space = IALG_DARAM0; memTab[0].attrs = IALG_PERSIST; //InA InB Out[2] memTab[1].size = (params->maxWidth*(2+2+2+2))*2; memTab[1].alignment = 128; memTab[1].space = IALG_DARAM0; memTab[1].attrs = IALG_PERSIST; return (2); }
此函数为TMS320 Algorithm Standard 即xDAIS中的 algAlloc()函数的实现,其返回一个该算法所需的内存记录表。(详见SPRU360E)
Int SWOSD_TI_initObj(IALG_Handle handle, const IALG_MemRec memTab[], IALG_Handle p, const IALG_Params *algParams) { const SWOSD_Params *params = (SWOSD_Params *)algParams; SWOSD_TI_Obj *obj = (SWOSD_TI_Obj *)handle; if (params == NULL) { params = &SWOSD_TI_PARAMS; } obj->swOsdCtrl.openPrm.maxWidth = params->maxWidth; obj->swOsdCtrl.openPrm.maxHeight = params->maxHeight; obj->memLineBuf = memTab[1].base; return (SWOSD_SOK); }
在使用时:
pLineBufA[0] = (Int64*)(swOsdObj->memLineBuf + offset); offset += width; pLineBufA[1] = (Int64*)(swOsdObj->memLineBuf + offset); offset += width; pLineBufB[0] = (Int64*)((Int32)swOsdObj->memLineBuf + offset); offset += width; pLineBufB[1] = (Int64*)((Int32)swOsdObj->memLineBuf + offset); offset += width; pLineBufOut[0] = (Int64*)((Int32)swOsdObj->memLineBuf + offset); offset += width; pLineBufOut[1] = (Int64*)((Int32)swOsdObj->memLineBuf + offset); offset += width;
然后内部将要处理的数据用DMA拷贝到memLineBuf,并使用乒乓结构:
SWOSD_TI_DMA_Fast2D1D ( dmaHandle, SWOSD_DMA_CH_IN_A, (void *)pInA, (void *)((UInt32)pLineBufA[0] + 0x30000000), width, 2, srcPitch, width, srcPitch, (-width) );
至于上面的代码片段中目的地址 (void *)((UInt32)pLineBufA[0] + 0x30000000)中为什么在pLineBufA[0] 加了0x30000000还是没有弄明白,请高人指点。
(因为dma是个外设,他看到的地址和dsp看到的地址是不一样的。之间有个0x30000000的偏移。)
本文目前只总结出了原因,至于实现正在尝试。
欢迎交流沟通。
转载注明:http://blog.csdn.net/guo8113/article/details/25026777
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。