有不少的朋友,特别是刚刚接触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的偏移。

L2 SRAM address is 0x108_00000. The L3 address of c674 L2 SRAM address (GEM UMAP0) is 0x408_0000 .The conversion is from 0x108_0000 to 0x408_0000 by adding 0x0300_0000.
DONT USE 0x300_0000 .IT WILL CRASH THE SYSTEM.)

本文眼下仅仅总结出了原因,至于实现正在尝试。

欢迎交流沟通。

转载注明:http://blog.csdn.net/guo8113/article/details/25026777






关于DM8168中移植算法速度慢、效率低的新发现的更多相关文章

  1. STL中的算法小结

    ()要运用STL的算法,首先必须包含头文件<algorithm>,某些STL算法用于数值处理,因此被定义于头文件<numeric> ()所有STL算法都被设计用来处理一个或多个 ...

  2. Akamai在内容分发网络中的算法研究(翻译总结)

    作者 | 钱坤 钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护. 原文是<Algorithmic Nuggets in Content Delivery& ...

  3. JS中的算法与数据结构——排序(Sort)(转)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

  4. 提升SQLite数据插入效率低、速度慢的方法

    前言 SQLite数据库由于其简单.灵活.轻量.开源,已经被越来越多的被应用到中小型应用中.甚至有人说,SQLite完全可以用来取代c语言中的文件读写操作.因此我最近编写有关遥感数据处理的程序的时候, ...

  5. JS中的算法与数据结构——排序(Sort)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

  6. 提升SQLite数据插入效率低、速度慢的方法(转)

    前言 SQLite数据库由于其简单.灵活.轻量.开源,已经被越来越多的被应用到中小型应用中.甚至有人说,SQLite完全可以用来取代C语言中的文件读写操作.因此我最近编写有关遥感数据处理的程序的时候, ...

  7. Vue中diff算法的理解

    Vue中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DOM结 ...

  8. React中diff算法的理解

    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...

  9. [转载]提升SQLite数据插入效率低、速度慢的方法

    转载地址:http://blog.csdn.net/chenguanzhou123/article/details/9376537#,如果有侵犯原创,请留言告知,本人会及时删除. 前言 SQLite数 ...

随机推荐

  1. SpringMVC中url映射到Controller

    SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式.前端控制器就是DispatcherServlet控制器,只要满足web.xml文件中的[url-pattern]的规 ...

  2. 【LuoguP2210 USACO】 Haywire

    这种答案跟序列排列顺序有关的,n比较小的(稍微大一点的也可以),求最优解的,一般都可以随机化过 随机化不一定是模拟退火或是什么遗传蚁群 哪怕只是直接随机化一个序列,只要你随机的次数够多,它都能找到正解 ...

  3. vs2008 启动IE浏览器 出现DW20.exe占用大量cpu 服务器iis 异常调试

    DW20.exe占用大量cpu 服务器iis运行出现异常想查一下故障原因,发现有好几个DW20.exe进程,每个占用20%左右的cpu,在任务管理器中将其终止后,它又自动运行起来了 查了一下DW20. ...

  4. 自学Python八 爬虫大坑之网页乱码

    Bug有时候破坏的你的兴致,阻挠了保持到现在的渴望.可是,自己又非常明白,它是一种激励,是注定要被你踩在脚下的垫脚石! python2.7中最头疼的可能莫过于编码问题了,尤其还是在window环境下, ...

  5. 时间框的属性编辑(WdatePicker日期插件)

    效果图如下:可以设置输入的时间不大于,或不小于某日. //引用js包 <script type="text/javascript" src="${basePath} ...

  6. Shiro图解

  7. Eclipse 每次ctrl-c ctrl-v 就变慢?

    继续闲着,所以继续写 大小: 60.7 KB 查看图片附件

  8. Struts2 在登录拦截器中对ajax请求的处理

    前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...

  9. 【WPF】使用 XAML 的 Trigger 系统实现三态按钮

    利用 WPF 的 Trigger 系统,也可以很简单的只使用xmal实现三态按钮.在Window或UserControl的资源中声明按钮的style并加入触发功能.使用的时候直接在button里复写s ...

  10. 【Oracle】数据迁移工具(2):Data Dump

    Data Dump 使用命令行IMPDP/EXPDP实现导入导出表.schema.表空间及数据库.IMPDP/EXPDP命令行中可以加入以下选项,来实现更细粒度的导入导出. IMPDP/EXPDP和I ...