zoukankan      html  css  js  c++  java
  • 关于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的偏移。

    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


    
    
    
    
  • 相关阅读:
    常用的 HTML 头部标签
    placeholder的兼容处理方法
    用Meta标签代码让360双核浏览器默认极速模式打开网站不是兼容模式
    终于有人把P2P、P2C、O2O、B2C、B2B、C2C的区别讲透了!还有许多其它类别的类型分享
    JS判断android ios系统 PC端和移动端
    一路的前端编辑器
    图片压缩的在线好工具
    关于文本换行的问题
    字符、字节的概念及其区别
    application/x-www-form-urlencoded接口响应报文中文乱码
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6984193.html
Copyright © 2011-2022 走看看