1. 程式人生 > >關於DM8168中移植算法速度慢、效率低的新發現

關於DM8168中移植算法速度慢、效率低的新發現

use 效率 dsm crash per eight pan param rcp

有不少的朋友,特別是剛剛接觸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中移植算法速度慢、效率低的新發現