關於xdais

一、對於 IALG 接口之理解
先說 XDAIS 算法標準,原本以爲是類似 C 的語法標準,結果買了本書查了下才知道,這是一個實現標
準(個人定義,呵呵),不是定義算法該如何具體去寫,而是定義了算法能做什麼不能去做什麼,好像
有 46 條規則,還在完善中。至於爲什麼要符合這個標準,是因爲現在第三方廠家提供算法都是按照它來
寫的,這樣更方便系統集成(比如 TI 的某部分程序+你自己完成的某部分程序)......
對於規則中一些編程的規範,不在重複,沒多大意思。主要關心的是接口的問題。提到接口,就不能
不說下 XDAIS 最終要實現的目標--就是將算法與硬件的使用相分離,如果使用硬件資源,只能使用
邏輯資源,真正分配時不依靠算法本身,這樣可以使算法在任意平臺下都可以被調用...
XDAIS 定義的抽象接口包括 2 部分:IALG,IDMA2。
IALG 是算法實例接口,頭文件是 ialg.h。它的主要任務是讓算法定義其使用的存儲器資源以實現更
高效資源利用。所有的 XDAIS 算法都要實現 IALG 接口。其中一個結構體特殊,它是一些函數的結構
體,IALG_Fxns
typedef struct IALG_Fxns {
Void *implementationId;
Void (*algActivate)(IALG_Handle);
Int
(*algAlloc)(const IALG_Params *, struct IALG_Fxns **, IALG_MemRec
*);
Int
(*algControl)(IALG_Handle, IALG_Cmd, IALG_Status *);
Void (*algDeactivate)(IALG_Handle);
Int
(*algFree)(IALG_Handle, IALG_MemRec *);
Int
(*algInit)(IALG_Handle, const IALG_MemRec *, IALG_Handle, const
IALG_Params *);
Void (*algMoved)(IALG_Handle, const IALG_MemRec *, IALG_Handle,
const IALG_Params *);
Int
(*algNumAlloc)(Void);
} IALG_Fxns;
上面結構體中的所有函數都要實現或賦予相應的值,就算不需要完成任何功能,也要將指針設置爲
NULL。結構體中只有第一個成員變量比較特殊,不是函數指針而是一個空指針,它的作用是唯一標識
模塊的實現,經常需要用到。
剩下定義的函數可以分爲 3 類:1.用於創建、初始化和刪除實例對象的函數,包括:
algAlloc(),algInit()和 algFree();2.算法處理的函數,包括:algActivate()和
algDeactivate();3.用於控制和重定位實例對象的函數,包括:algControl()和 algMoved()。
剩下的一個 algNumAlloc()函數可在任何時候調用且值不變,主要是求得算法實例的需要分配的存儲
器數目。
按順序逐一而來:
1.algActivate()。功能:在數據處理之前,實現臨時存儲器的初始化。參數是算法實例的句柄
IALG_Handle handle,通過該句柄識別出算法需要的不同類型的緩衝,並完成相應的初始化。該
函數是可選實現的,僅當在數據處理之前需要初始化時才實現,如不實現可置 NULL,以下雷同。
調用的前提:必須在 algInit()成功之後才能調用;handle 是一個有效的算法句柄;它不能搶佔
對象的其它方法;如果算法實現了 IDMA2 接口,則 algActivate()必須在 dmaInit()成功後調用。
實現此函數之後,算法中所有方法都可使用。
2.algAlloc()。功能:得到算法對象對於存儲器的需求情況。第一個參數是指向用於創建算法對象
的參數,如果爲 NULL 則是默認參數,第二個參數是輸出參數,返回給父 IALG 函數;第三個參數是
一個存儲器記錄的表格。如果成功返回一個非 0 整數,這個整數說明表格中包含多少個有效項。
調用前提:存儲器表格中記錄的個數不能少於 algNmAlloc()返回值,params 允許爲空。
3.algControl()。功能:算法的控制和狀態信息的提取。第一個參數是算法實例的句柄,剩下的
2 個參數是算法特定的。返回值是 IALG_EOK 或是其它出錯信息。這個函數實現是可選的,如不實現
設置爲空。
調用條件:只能在 algInit()後調用,handle 是一個有效句柄,cmd 的數值必須小於
IALG_SYSCMD。
4.algDeactivate()。功能:保存所有的持久數據到非臨時存儲器上。與 algActivate()類似,
在其之後只能調用 algActive()或 algFree()。
5.algFree()。功能:獲得算法的存儲器資源。與 algAlloc()類似,返回值是存儲器表格的有效
項數。存儲器表格中包含所有傳遞給算法的指向緩衝的指針。
algInit()。功能:初始化算法實例對象。algInit()實現在運行階段創建算法實例對象,在該函數成功
返回後,算法實例對象纔開始處理數據。參數解釋:第一個參數是算法實例句柄,它指向一個初始化後
的 IALG_Obj 結構,數值與 memTab[0].base 相同(看不明白先看下他們的數據結構);第二個
參數是存儲器記錄表格,有效記錄項目數與 algAlloc()相同;第三個參數是另一個算法實例對象的句柄,
通常爲 NULL,表示沒有父對象存在;最後一個是算法特定參數,可以爲 NULL。
調用條件較複雜。。。。。。
algMoved()。功能:重新定位算法實例的存儲器資源。主要是當算法實例需要移動時調用,可選
實現,不實現表明不可移動。參數與 algInit()中一樣。
algNumAlloc()。功能:返回需要的存儲器數目。必須大於等於 algAlloc()的返回值,可以在任
何時刻調用,且值不變
二、XDAIS 算法封裝需要注意的幾個問題:
1,algNumAlloc()接口。XDAIS 工具生成的算法實現.c 文件中,並沒有該函數,默認的爲
NULL。如下面的紅色字體標示:
#define IALGFXNS \
&RVM_TI_IALG,/* module ID */
\
NULL,
/* activate */
\
RVM_TI_alloc,/* alloc */
\
NULL,
/* control (NULL => no control ops) */ \
NULL,
/* deactivate */
\
RVM_TI_free, /* free */
\
RVM_TI_initObj, /* init */
\
NULL,
/* moved */
\
NULL /* numAlloc (NULL => IALG_MAXMEMRECS) */
如果沒有 algNumAlloc()函數的話,mem rec 的數目是小於等於默認值
IALG_DEFMEMRECS(該值爲 4),也就是說麼說麼 memTab 的大小最多爲 4,當 memTab
的數目大於 4 的時候,需要加上該接口,返回當前算法最大的 memTab 數目。具體可以參考 lalg.h
文件。
2,XDM_SETACCESSMODE_READ()or
XDM_CLEARACCESSMODE_WRITE()。當用到 CPU 向 DSP 讀寫數據時在算法裏不要
忘記加上相應的該接口函數(可參靠 xdm.h 文件)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章