視頻監(jiān)控系統(tǒng)中快速實(shí)現(xiàn)ARM和DSP的通信和協(xié)同工作
4.2 DSP系統(tǒng)工程師應(yīng)該如何著手?
通常DSP算法工程師都會(huì)把自己的符合xDM標(biāo)準(zhǔn)算法編成一個(gè).lib文件(或 .a6?P),供DSP系統(tǒng)工程師調(diào)用。DSP系統(tǒng)工程師最終build出一個(gè)DSP Server(也就是DSP的可執(zhí)行程序.x6?P,和CCS下編譯生成的.out類似)。(參考http://focus.ti.com/lit/ug/sprued5b/sprued5b.pdf,這個(gè)文檔會(huì)講到.xdc和.bld等文件,Codec Engine1.20及以上版本的用戶可以先不細(xì)究,后面介紹工具幫您自動(dòng)生成這些文件。)
1)如果現(xiàn)在有一個(gè).lib文件(或 .a6?P)(算法必須符合xDM標(biāo)準(zhǔn)),如何生成自己的DSP Server呢?下面URL有詳細(xì)的關(guān)于RTSC Codec and Server Package Wizard工具介紹,教您如何把一個(gè).lib文件封裝成RTSC Codec 包和RTSC DSP Server包,并最終build出DSP的可執(zhí)行程序.x6?P。http://wiki.davincidsp.com/index.php?title=RTSC_Codec_And_Server_Package_Wizards http://wiki.davincidsp.com/index.php?title=I_just_want_my_video_codec_to_work_with_the_DVSDK
2)如果您使用的是Codec Engine 1.20以前的版本,請(qǐng)參考Codec Engine安裝路徑下examples/servers/video_copy這個(gè)例子。這時(shí)就需要搞清楚sprued6c.pdf和sprued5b.pdf中提到的.xdc和.xs等文件的功能,也可以在video_copy中的相關(guān)文件的基礎(chǔ)上修改手動(dòng)創(chuàng)建出自己的RTSC Codec包和RTSC DSP server包。
3)創(chuàng)建好RTSC Codec 和RTSC DSP Server包之后,就是如何build出.x6?P的問題了。點(diǎn)擊圖2所示的Examples,就可以找到build Codec Engine例子的說明文檔的鏈接。按照這個(gè)文檔做一遍后,就可以對(duì)如何build Codec Server有一個(gè)清楚的了解。其中關(guān)鍵是修改user.bld和xdcpaths.mak文件,設(shè)置Codec Engine依賴的其它軟件模塊和工具的正確路徑。
4)如果自己的硬件DDR2大小和例子中的256Mbytes不一致,需要修改DSP的.tcf文件和其他配置。還有些工程師不清楚如何分配memory及如何決定具體段,如:DDRALGHEAP和DDR的大小,以及如何配置./loadmodules里的參數(shù)都請(qǐng)參考: http://wiki.davincidsp.com/index.php?title=Changing_the_DVEVM_memory_map。
4.3 ARM應(yīng)用程序工程師應(yīng)該如何著手?
ARM應(yīng)用工程師需要調(diào)用Codec Engine的VISA API,最終編出ARM側(cè)的可執(zhí)行程序,因此,必須根據(jù)自己的應(yīng)用學(xué)習(xí)相關(guān)的VISA API、如何創(chuàng)建應(yīng)用側(cè)Codec Engine的package及配置文件。(參考http://focus.ti.com/lit/ug/sprue67d/sprue67d.pdf,這個(gè)文檔也涉及到如何調(diào)試Codec Engine的內(nèi)容)。
1)了解ARM應(yīng)用程序調(diào)用Codec Engine的流程、VISA API和其他Codec Engine API。可以參考Codec Engine安裝路徑下examples/apps/video_copy的例子(較簡(jiǎn)單)或者DVSDK安裝路徑下demos里的encode/decode/encodedecode例子(較復(fù)雜)。http://wiki.davincidsp.com/index.php?title=Configuring_Codec_Engine_in_Arm_apps_with_createFromServer
2)了解ceapp.cfg文件。sprue67d.pdf有相關(guān)介紹,可以先讀懂examples/apps/video_copy/ceapp.cfg。
3)用4.2 3)中提到的方法學(xué)習(xí)如何build ARM側(cè)的可執(zhí)行程序。
4)如何在多線程中調(diào)用codec engine,參考:http://wiki.davincidsp.com/index.php?title=Multiple_Threads_using_Codec_Engine_Handle
5)還可以參考以下三個(gè)文檔了解更多TI demo的ARM應(yīng)用程序的結(jié)構(gòu)、線程調(diào)度等具體的問題。
EncodeDecode Demo for the DaVinci DVEVM/DVSDK 1.2 (Rev. A) (spraah0a.htm, 8 KB) 27 Jun 2007 Abstract
Encode Demo for the DaVinci DVEVM/DVSDK 1.2 (Rev. A) (spraa96a.htm, 8 KB) 27 Jun 2007 Abstract
Decode Demo for the DaVinci DVEVM/DVSDK 1.2 (Rev. A) (spraag9a.htm, 8 KB) 27 Jun 2007 Abstract
5.使用中常碰到的問題
1)如果遇到問題可以先訪問http://wiki.davincidsp.com/index.php?title=Codec_Engine_FAQ。
2)有些工程師沒有DSP開發(fā)經(jīng)驗(yàn),或者暫時(shí)沒有仿真器通過JTAG調(diào)試DSP??梢詤⒖枷旅婢W(wǎng)頁的內(nèi)容,先做一個(gè)“Hello World”的例程對(duì)ARM和DSP如何協(xié)同工作有個(gè)感性認(rèn)識(shí)。http://wiki.davincidsp.com/index.php?title=How_to_build_an_ARM/DSP_Hello_World_program_on_the_DaVinci_EVM
3)很多工程師都是參考video_copy的例子,在它的基礎(chǔ)上把自己的算法加進(jìn)去。因?yàn)橛性创a,這樣比較容易。但肯定要根據(jù)自己算法的需要修改ARM和DSP之間傳遞的buffer和參數(shù),重要的是先保證ARM側(cè)的應(yīng)用程序可以把buffer和參數(shù)正確傳遞到DSP,DSP可以把處理之后的buffer正確的傳到ARM側(cè)的應(yīng)用程序。把這個(gè)通路打通之后,就比較容易定位問題是出在ARM應(yīng)用程序還是DSP側(cè)的算法。另外,參考video_copy例子時(shí)注意代碼的注釋,以便清楚哪一句代碼可以刪掉哪一句必須要修改或保留。如果要擴(kuò)展xDM的數(shù)據(jù)結(jié)構(gòu)請(qǐng)參考:http://wiki.davincidsp.com/index.php?title=Extending_data_structures_in_xDM。
4)Codec Engine DSP側(cè)會(huì)涉及到Cache一致性的問題。請(qǐng)參考:http://wiki.davincidsp.com/index.php?title=Cache_Management
5)關(guān)于Codec Engine系統(tǒng)調(diào)試,有以下幾種方法:
A.打開Codec Engine trace,通過打印信息看問題出在什么地方。比如engine_open失敗,DSP側(cè)不能創(chuàng)建codec 等等。
a)Codec Engine 2.0及以上版本,請(qǐng)參考:http://wiki.davincidsp.com/index.php?title=Easy_CE_Debugging_Feature_in_CE_2.0
b)Codec Engine 1.x版本,請(qǐng)參考:http://wiki.davincidsp.com/index.php?title=TraceUtil
B.ARM應(yīng)用程序跑起來后,用仿真器連上CCS調(diào)試DSP側(cè)程序,參考:http://wiki.davincidsp.com/index.php?title=Debugging_the_DSP_side_of_a_CE_application_on_DaVinci_using_CCS
C.用Soc Analyzer可以做系統(tǒng)調(diào)試之外,還可以統(tǒng)計(jì)具體函數(shù)運(yùn)行(ARM和DSP側(cè))時(shí)間(benchmark)。請(qǐng)參考:http://tiexpressdsp.com/wiki/index.php?title=SoC_Analyzer
6)因?yàn)镃odec Engine是介于ARM 應(yīng)用程序和編解碼算法中間的軟件模塊,很多工程師非常想知道它的開銷(overhead),請(qǐng)參考:http://wiki.davincidsp.com/index.php?title=Codec_Engine_Overhead
7)如何在Linux環(huán)境下編DSP的匯編或線性匯編程序?
在Codec Engine安裝路徑下/packages/config.bld文件里
var C6?P = xdc.useModule(‘ti.targets.C6?P’);
之后添加:
C6?P.extensions[“.sa”] = {
suf: “.sa”, typ: “asm:-fl”
}
或
C6?P.extensions[“.asm”] = {
suf: “.asm”, typ: “asm:-fa”
}
8)DSP側(cè)如何統(tǒng)計(jì)具體函數(shù)運(yùn)行時(shí)間?
TI DSPC6?x+內(nèi)核有一個(gè)6?位的硬件定時(shí)器(Time Stamp Counter),它的頻率和CPU頻率一致。最簡(jiǎn)單的辦法是使用TSC的低32位TSCL。注意在DM6?4x中,TSCH用于ARM。
#include
void main (){
…
TSCL=0;
…
t1=TSCL;
my_code_to_benchmark();
t2=TSCL;
printf(“# cycles == %dn”, (t2-t1));
}
6.結(jié)語
以上針對(duì)如何上手TI的Codec Engine做了簡(jiǎn)單的歸納,還有很多具體細(xì)節(jié)的問題沒有涉及到。還請(qǐng)各位工程師從自己要用的軟件模塊發(fā)布說明文檔開始找到相關(guān)的文檔并研究。
評(píng)論