【DM642】ICELL Interface—Cells as Algorithm Containers

ICELL Interface—Cells as Algorithm Containers:

DSP的算法標準(XDAIS)爲算法提供了一個標準的接口.這樣我們就可以使用第三方的算法.For technical detailson the TMS320 DSP Algorithm Standard, see TMS320 DSP AlgorithmStandard Rules and Guidelines (SPRU352) and the TMS320 DSPAlgorithm Standard API Reference (SPRU360).

RF5的應用程序使用了相對多的算法和通道,爲了簡化算法的融合,RF5使用"cell".一個"cell"是一個XDAIS算法的封裝.一個RF5通道可以包含多個細胞,因此多個算法.在通道結構的核心是細胞的概念.算法的運行時函數可以不同.一個細胞是一個標準的算法封裝.對每一個算法實例,就會有一個細胞對象.通道不直接和算法接口,而是同細胞接口,結果調用算法接口.RF5提供細胞接口ICELL.他的結構被接口定義,而沒有ICELL模塊函數調用.

ICELL接口類似於IALG接口規範.也就是,這個接口的結構在頭文件中定義.必須有一個結構來使用.對ICELL和IALG來說,最主要的區別是算法提供者被要求使用IALG接口.而,算法設計者一般爲每個算法使用ICELL接口來爲某個特別地應用定製.

應用必須創建如下的結構爲每一個算法:

  • ICELL_Fxns類型的結構和它的函數.這個結構爲算法的執行函數提供了一個一致的接口,它的名字
    和參數不是標準的.這個結構在RF_DIR\include\icell.h中定義:
    typedef struct ICELL_Fxns {
        Bool(*cellClose )(ICELL_Handle handle);
        Int(*cellControl)(ICELL_Handle handle, IALG_Cmd cmd, IALG_Status*status);
        Bool(*cellExecute)(ICELL_Handle handle, Arg arg);
        Bool(*cellOpen )(ICELL_Handle handle);
    } ICELL_Fxns;

    例如:RF_DIR\apps\rf5\cells\vol\cellVol.h和cellVol.c文件使用了ICELL_Fxns結構和它的函數爲VOL算法.
    Int VOL_cellControl( ICELL_Handle handle, IVOL_Cmd cmd, IVOL_Status*status);
    Bool VOL_cellExecute( ICELL_Handle handle, Arg arg );

    ICELL_Fxns VOL_CELLFXNS = {
        NULL,
       VOL_cellControl,
       VOL_cellExecute,
        NULL
    };
    cellClose,cellControl,cellOpen並不一定需要.cellExecute是必須的.cellExecute在線程的主循環中被調用了很多次.cellControl可以被偶爾調用來調整控制信息.cellClose,cellOpen是在調用CHAN_open()和CHAN_close()時被使用的.即:在細胞被創建和銷燬的時候創建的.
    這些函數一般使用算法提供的IALG執行和AlGRF模塊來激活或不激活算法.
    Bool VOL_cellExecute( ICELL_Handle handle, Arg arg )
    {
        IVOL_Fxns*volFxns = (IVOL_Fxns *)handle->algFxns;
        IVOL_HandlevolHandle = (IVOL_Handle)handle->algHandle;
        // activateinstance object
       ALGRF_activate( handle->algHandle );
       volFxns->amplify( volHandle,
        (XDAS_Int16*)handle->inputIcc[0]->buffer,
        (XDAS_Int16*)handle->outputIcc[0]->buffer );
        //deactivate instance object
       ALGRF_deactivate( handle->algHandle );
        return (TRUE );
    }

  • ICELL_Obj對象:
    這個結構體定義了一個細胞的特徵.這個結構體在RF_DIR\include\icell.h中定義.我們也可以修改這個結構體.
    typedef struct ICELL_Obj {
        Intsize;                
        Stringname;             
        ICELL_Fxns*cellFxns;    
        PtrcellEnv;             
        IALG_Fxns*algFxns;      
        IALG_Params*algParams;  
        IALG_HandlealgHandle;   
        UnsscrBucketIndex;      
        ICC_Handle*inputIcc;    
        UnsinputIccCnt;         
        ICC_Handle*outputIcc;   
        UnsoutputIccCnt;        
    } ICELL_Obj;

    這個結構體幫助創建ICELL,IALG,ICC和SSCR模塊之間的關係.ICELL_Obj結構體中的一些需要我們注意:
    --size和name:大下是:sizeof(ICELL_Obj).name是:算法使用的字符串.
    --cellFxns:這個元素指向了前面描述的ICELL_Fxns.
    --cellEnv:這個是用戶自己定義的.每一個細胞都有自己的cellEnv指針,這個可以被用來保持細胞特性指針.每一個細胞可以有不同的結構定義.例如:如果一個算法有相互包含的函數,如,apply1和apply2,cellExecute結構可以決定哪一個函數來執行,這個是基於cellEnv結構體中的一個域,而且這個域是調用函數的線程可以寫的.另外一個對cellEnv結構體的使用是存儲DMA句柄(被細胞使用).在cellOpen函數中,DMA通道可以被分配並存儲在cellEnv結構體中.然後,cellExecute函數可以使用這個DMA句柄.
    --  algFxns, algParams, and algHandle. Theseelements have types defined by the IALG interface that is part ofthe XDAIS specification.
    --  scrBucketIndex. Generally, all cells inchannels executed by tasks at the same priority level should havethe same scrBucketIndex. This element is used by the SSCR module,which is described in Section 7.5, SSCR Module—Shared ScratchMemory, page 54.
    --  inputIcc andoutputIcc:這些元素調用CHAN_regCell()是填充的.這個信息被ICC模塊使用.whichis  described in Section 7.4,ICC Module—Inter-CellCommunication, page 52.

  • For example, theRF_DIR\apps\rf5\threads\process\thrProcess.c file creates an arrayof elements of type ICELL_Obj for all the cells in the application,which you should modify to integrate your algorithms. The followingportion shows the declaration of the first cell.

  • 【DM642】ICELL <wbr>Interface—Cells <wbr>as <wbr>Algorithm <wbr>Containers

發佈了37 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章