本文介紹了TI的ARM+C6000 DSP異構(gòu)多核平臺(tái)(如Davinci系列,,OMAP3系列,,OMAP-L系列)的通信機(jī)制,包括Codec Engine,、IUNIVERSAL API,、C6Accel、C6Run,、RPMSG,、RCM和OpenCL等。從底層的通信(CMEM+DSPLINK/SYSLINK)到高層的封裝和構(gòu)建系統(tǒng),。 Overview
本文介紹了TI的ARM+C6000 DSP異構(gòu)多核平臺(tái)(如Davinci系列,,OMAP3系列,OMAP-L系列)的通信機(jī)制,,包括Codec Engine,、IUNIVERSAL API、C6Accel,、C6Run,、RPMSG、RCM和OpenCL等。從底層的通信(CMEM+DSPLINK/SYSLINK)到高層的封裝和構(gòu)建系統(tǒng),。 Codec Engine: http://processors.wiki./index.php/Category:Codec_EngineCodec Engine相關(guān)的軟件部件可以從如下地址下載: http://software-dl./dsps/dsps_public_sw/sdo_sb/targetcontent/index.html,。Codec Engine (CE)是一個(gè)簡化了使用xDM通用API的編解碼器和算法的框架,能夠用于算法本地運(yùn)行(即算法和算法CEApp在同一個(gè)處理器上運(yùn)行)或者遠(yuǎn)端運(yùn)行(即在不同處理器上運(yùn)行),,可以用于同構(gòu)或者異構(gòu)的處理器(OMAP3,、DM644x,DM64x,,DM643x,,DM3555,DM365等,,以及多核C6472,,C6474等)。集成的應(yīng)用程序調(diào)用Codec Engine API,。在Codec Engine內(nèi)部,,反應(yīng)XDM API的VISA API用于實(shí)際的編解碼的調(diào)度。如果算法運(yùn)行于遠(yuǎn)端,,VISA有stub和skeleton來實(shí)現(xiàn)一個(gè)遠(yuǎn)端程序調(diào)度(RPC,,remote procedure call,DSP/BIOS LINK或者syslink用于底層的IPC(inter-processor communication)通信),。為了能夠采用Codec Engine,需要實(shí)現(xiàn)定義在XDM algorithm standard和XDAIS Algorithm Standard中的算法接口規(guī)范,。下圖是一個(gè)ARM+DSP的通信協(xié)同示意圖,。Codec Engine是介于應(yīng)用層(ARM側(cè)的應(yīng)用程序)和信號(hào)處理層(DSP側(cè)的算法)之間的軟件橋梁。ARM應(yīng)用程序調(diào)用Codec Engine的VISA (Video, Image, Speech, Audio)API( VIDENC_process(a, b, c )),。Codec Engine的stub (ARM側(cè))會(huì)把參數(shù)a, b, c以及要調(diào)用DSP側(cè)process這個(gè)信息打包,,通過消息隊(duì)列(message queue)傳遞到DSP。Codec Engine的skeleton(DSP側(cè))會(huì)解開這個(gè)參數(shù)包,,把參數(shù)a, b, c轉(zhuǎn)換成DSP側(cè)對應(yīng)的參數(shù)x, y, z(比如ARM側(cè)傳遞的是虛擬地址,,而DSP只能認(rèn)物理地址),DSP側(cè)的server(優(yōu)先級(jí)較低,,負(fù)責(zé)和ARM通信的任務(wù))會(huì)根據(jù)process這一信息創(chuàng)建一個(gè)DSP側(cè)的process(x, y, x)任務(wù)最終實(shí)現(xiàn)VIDENC_process(a, b, c)的操作,。
圖1. Codec Engine應(yīng)用和算法調(diào)用示意圖 Codec Engine軟件模塊和組件在每款提供了Codec Engine的TI DSP的DVSDK開發(fā)包中還提供了如下軟件模塊和工具配合使用: Framework Components: http://processors.wiki./index.php?title=Framework_Components_FAQ
xDAIS:http://processors.wiki./index.php?title=Category:XDAISxDAIS 是一個(gè)標(biāo)準(zhǔn),,它定義了TI DSP算法接口的標(biāo)準(zhǔn)。這樣大大提高了DSP算法軟件的通用性,。DSP算法工程師要寫出能被ARM通過Codec Engine調(diào)用的算法,,必須保證自己的算法接口符合這個(gè)標(biāo)準(zhǔn)。 XDC ToolsXDC Tools和gmake類似,,是一個(gè)工具,。XDC根據(jù)用戶定義的一套build指令,通過調(diào)用用戶指定的ARM 工具鏈(Tool Chain)和DSP編譯器(C6x Code Generation Tools )build出ARM側(cè)和DSP側(cè)的可執(zhí)行文件,??梢韵炔槐丶?xì)究這個(gè)工具,只需通過編Codec Engine的例子,,知道如何設(shè)置build指令就可以了,。
圖2. xDC build系統(tǒng) DSP/BIOS Link :http://processors.wiki./index.php?title=DSPLink_OverviewDSP/BIOS Link是實(shí)現(xiàn)ARM和DSP之間通信的底層軟件,Codec Engine就是建立在這個(gè)底層軟件之上,。在修改系統(tǒng)內(nèi)存分配(缺省是256MB的DDR2)時(shí),,DSP/BIOS Link 1.38版本的用戶需要修改DSP/BIOS Link的配置文件,并重新build DSP/BIOS Link,。而DSP/BIOS Link 1.40版本以后的用戶就無需此操作,。 DSP/BIOS Link包括了PROC的基本的處理器控制(如GPP綁定DSP,GPP加載DSP的可執(zhí)行程序,,GPP啟動(dòng)DSP,,GPP停止,GPP接綁定DSP),、IPC通信機(jī)制(Message Queue消息隊(duì)列MSGQ,、基于事件回收的流模型CHNL、基于流的循環(huán)緩沖的RingIO),、IPC通信構(gòu)建模塊(底層的內(nèi)存管理分配的POOL,、多處理器互斥訪問的MPCS、對于DSP內(nèi)存讀寫的PROC_read/PROC_write),。 Sys/BIOS Link : http://processors.wiki./index.php/Differences_Between_DSP/BIOS_and_SYS/BIOSCMEM: http://processors.wiki./index.php/CMEM_Overview 提供內(nèi)存管理,,用戶能定義的大小固定、連續(xù)地址的POOL,。在cmem 2.0之后還引入了Heap,,CMEM地址空間在POOL之后的都認(rèn)為是HEAP。用戶可以通過在cmem的內(nèi)核驅(qū)動(dòng)加載時(shí)設(shè)置參數(shù),,如modprobe cmemk phys_start=0x83000000 phys_end=0x85200000 pools=21x4096,,具體的cmem內(nèi)存分配的pool和heap可以從cat /proc/cmem來得到具體的狀態(tài),。 C6x Code Generation Tools :C6x Code Generation Tools是Linux環(huán)境下C6000系列DSP的編譯器。我們用CCS開發(fā)DSP時(shí)都是用的Windows環(huán)境下的DSP編譯器,。 DSP/BIOS :http://processors.wiki./index.php?title=Category:DSPBIOSDSP/BIOS是TI 免費(fèi)提供的DSP實(shí)時(shí)操作系統(tǒng),。和上面C6x Code Generation Tools一樣,這里的DSP/BIOS也是Linux環(huán)境下的版本,。
圖3. TI BIOS系統(tǒng)的組件 MontaVista Linux PSPTI開發(fā)板的u-boot,、Linux Kernel版本。 Codec Engine軟件開發(fā)流程開發(fā)ARM+協(xié)處理器的平臺(tái)軟件需要算法在協(xié)處理端的開發(fā),、算法的集成,、ARM段APP程序的開發(fā)幾個(gè)方面。 DSP算法開發(fā)對于DSP算法,,處理算法性能和效率外,,從算法的集成需要讓ARM可以通過Codec Engine來調(diào)用DSP算的算法。因而需要1),、熟悉xDAIS和xDM標(biāo)準(zhǔn),。需要先了解xDAIS,xDM只是xDAIS的擴(kuò)展,。xDAIS 6.10及其以后的版本,,包含了一個(gè)工具QualiTI,可以檢查您的DSP算法是否滿足xDAIS標(biāo)準(zhǔn)(但不會(huì)檢查是否滿足xDM),。具體請參考:http://processors.wiki./index.php?title=QualiTI_XDAIS_Compliance_Tool ,。2)、熟悉Framework Components,。 Framework Components主要包括兩個(gè)模塊DSKT2和DMAN3,,它們分別負(fù)責(zé)DSP側(cè)的memory 和EDMA資源管理。DSP算法使用的memory必須是先向DSKT2提出申請并由DSKT2分配得到的,。同樣DSP算法使用的EDMA通道也是向DMAN3申請并由DMAN3分配得到的。而關(guān)于QDMA的操作,,是通過ACPY3這個(gè)模塊實(shí)現(xiàn)的,。這樣的好處是很容易對DSP側(cè)不同的算法做整合,不同的算法之間不用擔(dān)心資源(Memory和EDMA)的沖突問題,。Codec Engine DSP側(cè)會(huì)涉及到Cache一致性的問題,。請參考:http://wiki./index.php?title=Cache_Management DSP系統(tǒng)集成通常DSP算法工程師都會(huì)把自己的符合xDM標(biāo)準(zhǔn)算法編成一個(gè).lib文件(或 .a64P),供DSP系統(tǒng)工程師調(diào)用,。DSP系統(tǒng)工程師最終build出一個(gè)DSP Server(也就是DSP的可執(zhí)行程序.x64P,,和CCS下編譯生成的.out類似)。(參考http://focus./lit/ug/sprued5b/sprued5b.pdf ,,這個(gè)文檔會(huì)講到.xdc和.bld等文件,,Codec Engine1.20及以上版本的用戶可以先不細(xì)究,,后面介紹工具幫您自動(dòng)生成這些文件。) 1) 如果現(xiàn)在有一個(gè).lib文件(或 .a64P)(算法必須符合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í)行程序.x64P,。 http://processors.wiki./index.php?title=RTSC_Codec_And_Server_Package_Wizards
2) 如果您使用的是Codec Engine 1.20以前的版本,請參考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出.x64P的問題了,。其中關(guān)鍵是修改user.bld和xdcpaths.mak文件,設(shè)置Codec Engine依賴的其它軟件模塊和工具的正確路徑,。 4) 如果自己的硬件DDR2大小和例子中的256Mbytes不一致,,需要修改DSP的.tcf文件和其他配置。還有些工程師不清楚如何分配memory及如何決定具體段,,如:DDRALGHEAP和DDR的大小,,以及如何配置./loadmodules里的參數(shù)都請參考: http://wiki./index.php?title=Changing_the_DVEVM_memory_map。 ARM端應(yīng)用程序開發(fā)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./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??梢詤⒖?/span>Codec Engine安裝路徑下examples/apps/video_copy的例子(較簡單)或者DVSDK安裝路徑下demos里的encode/decode/encodedecode例子(較復(fù)雜),。 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,,參考: 5)還可以參考以下三個(gè)文檔了解更多TI demo的ARM應(yīng)用程序的結(jié)構(gòu),、線程調(diào)度等具體的問題。 C6AccelC6EZAccel能提供ARM+DSP架構(gòu)的SOC的調(diào)用DSP端算法的ARM端應(yīng)用程序的快速開發(fā),。適用于OMAP-L137/ OMAP-L138/OMAP3530/OMAP3525/DM3730/DM6446/DM8168/DM8148等處理器,。C6EZAccel包括了符合TI算法標(biāo)準(zhǔn)XDAIS的基于Codec Engine的算法庫的快速集成,。C6EZAccel還包括了ARM端應(yīng)用程序來啟動(dòng)這些DSP端算法。這些DSPlib庫用codec engine的IUNIVERSAL API做了封裝方便ARM端調(diào)用,。iUniversal APIs類似VISA API,,能通過Codec Engine接口傳遞函數(shù)參數(shù)和返回值等,。
圖4. C6EZAccel通過IUNIVERSAL API調(diào)用框架 http://processors.wiki./index.php/C6EZAccel C6RunC6EZRun本質(zhì)上講是一個(gè)build系統(tǒng),,即通過對程序的編譯結(jié)果后處理,首先用codec engine tools來編譯源代碼,,得到的目標(biāo)文件用code sourcery的gcc-arm重新編譯鏈接,,該方法適用于OMAP-L137/ OMAP-L138/OMAP3530/OMAP3525/DM3730/DM6446/DM8168/dm3725等處理器。 C6RunLibc6runlib-cc是一個(gè)Bash shell腳本,,編譯C代碼產(chǎn)生DSP端的C6000目標(biāo)文件,,首先調(diào)用C6000的編譯器并合理的處理命令行選項(xiàng)(c6runlib-cc命令行的語法符合開源GCC編譯器的語法),c6runlib-cc工具目前只支持C源文件,。經(jīng)由c6runlib-cc編譯和匯編的文件會(huì)再次分析產(chǎn)生2個(gè)額外的源文件,即2個(gè)RPC stub,,一個(gè)在ARM端(后綴名為".gpp_stub.o"),,一個(gè)在DSP端(擴(kuò)展名為".dsp_stub.o")。輸出的目標(biāo)文件會(huì)由c6runlib-ar進(jìn)行壓縮打包,。這個(gè)庫中包含了自動(dòng)的RPC調(diào)用,,屏蔽了底層的DSPLINK和其他的TI組件,。
圖5. C6RunLib工具編譯鏈接圖示
C6RunAppC6RunApp-cc是一個(gè)Bash shell的腳本,,能編譯C代碼產(chǎn)生C6000的目標(biāo)文件。首先調(diào)用TI C6000的編譯器cl6x,,當(dāng)然會(huì)對命令行選項(xiàng)進(jìn)行合適的處理,。然后c6runapp-cc還用來鏈接C6000目標(biāo)文件產(chǎn)生一個(gè)ARM/Linux的應(yīng)用程序。即c6runapp-cc工具合理的利用cl6x的編譯器和ARM GCC的編譯器來產(chǎn)生鏡像可執(zhí)行文件。目前的c6runapp-cc的工具只支持C源代碼,。
圖6. C6RunApp工具編譯鏈接圖示 圖1. C6RunApp常用的命令行選項(xiàng)
圖7. 從ARM端的開發(fā)到ARM+DSP端的開發(fā)
RPMSGhttp://www./wiki/RPMsg_Kernel_Sources http:///wiki/RPMsg_BIOS_Sources RPMSG是開源的IPC通信框架,開發(fā)于2011年,,用于Android 4.0,,首次出現(xiàn)在Linux 3.0的內(nèi)核里,。它簡化了SysLink 2.0的一些特性,提供更為簡單的用戶接口,??梢砸暈?/span>SysLink 3.0. RPMsg的特性:設(shè)備管理:遠(yuǎn)端處理器的全集管理,包括設(shè)備初始化,、加在可執(zhí)行程序,,內(nèi)存管理,運(yùn)行時(shí)電源管理,,遠(yuǎn)端處理器的trace的log,,嚴(yán)重錯(cuò)誤和異常管理,錯(cuò)誤恢復(fù)等,。 信息框架(Messaging Framework): Linux消息框架來在處理器間交換固定大小的控制信息,; 資源管理:申請和釋放遠(yuǎn)端的外設(shè)和硬件加速器、帶寬頻率和延遲管理,。 RPMSG的基本組件remoteproc:管理遠(yuǎn)端處理器設(shè)備狀態(tài)的驅(qū)動(dòng),。設(shè)備的加載和啟動(dòng)、功耗控制,、異常管理和錯(cuò)誤恢復(fù),。平臺(tái)相關(guān)的驅(qū)動(dòng)接口。 rpmsg: 遠(yuǎn)端處理器的消息隊(duì)列驅(qū)動(dòng),,提供消息傳遞機(jī)制,。 rpmsg-resmgr:管理時(shí)鐘和各種外設(shè)的請求限制的客戶端驅(qū)動(dòng); rpmsg-omx:用戶空間的接口與TI的OMX框架交互的客戶端驅(qū)動(dòng),,可以把部分的OMX框架的負(fù)荷轉(zhuǎn)交給協(xié)處理器,。 RPMSG底層驅(qū)動(dòng)機(jī)制iommu:OMAP遠(yuǎn)端協(xié)處理的MMU管理驅(qū)動(dòng) mailbox: 管理OMAP處理器內(nèi)的郵箱外設(shè)的驅(qū)動(dòng),提供不同的處理器子系統(tǒng)間的通信,; hwspinlock: 硬件外設(shè)的自旋鎖,,提供不同處理器間的硬件外設(shè)的仲裁; virtio:支持虛擬化的VirtIO框架
RCM
圖8. RCM服務(wù)器server端和客戶端client端通信示意 http://processors.wiki./index.php/RCM_Overview 一些軟件架構(gòu)組件如DSP Bridge,、Codec Engine需要把一些任務(wù)發(fā)送worker線程到遠(yuǎn)端處理器執(zhí)行包括創(chuàng)建線程,、得到CPU的負(fù)荷、分配遠(yuǎn)端內(nèi)存等,。RCM提供了通用的遠(yuǎn)端客戶端和服務(wù)器模型來實(shí)現(xiàn)平臺(tái)間任務(wù)的分配,。RCM構(gòu)建在XDC之上,使用IPC的MessageQ服務(wù)來實(shí)現(xiàn)底層通信,。TI81xx的Distributed OpenMax就是基于RCM實(shí)現(xiàn)的,。 OPENCLOpenCL最初蘋果公司開發(fā),擁有其商標(biāo)權(quán),,并在與AMD,,IBM,,英特爾和nVIDIA技術(shù)團(tuán)隊(duì)的合作之下初步完善。隨后,,蘋果將這一草案提交至Khronos Group,。2008年6月16日,Khronos的通用計(jì)算工作小組成立,。5個(gè)月后的2008年11月18日,,該工作組完成了OpenCL 1.0規(guī)范的技術(shù)細(xì)節(jié)。該技術(shù)規(guī)范在由Khronos成員進(jìn)行審查之后,,于2008年12月8日公開發(fā)表,。2010年6月14日,OpenCL 1.1 發(fā)布,。目前OpenCL 2.0的規(guī)范正在制定中,。 http://processors.wiki./index.php/OpenCL
Reference:http://houh-1984.blog.163.com/ Framework Components DMAN3/ACPY3 Users Guide Davinci Multimedia Application Interface Codec Engine Application Developers Guide How do I Integrate new codecs into DVSDK Debugging the DSP side of a CE application using CCS Configuring Codec Engine in Arm apps with createFromServer http://www..cn/general/cn/docs/gencontent.tsp?contentId=61575 http://processors.wiki./index.php/C6EZAccel http://processors.wiki./index.php/C6EZRun
本文介紹了TI的ARM+C6000 DSP異構(gòu)多核平臺(tái)(如Davinci系列,OMAP3系列,,OMAP-L系列)的通信機(jī)制,,包括Codec Engine、IUNIVERSAL API,、C6Accel,、C6Run、RPMSG,、RCM和OpenCL等,。從底層的通信(CMEM+DSPLINK/SYSLINK)到高層的封裝和構(gòu)建系統(tǒng)。 |
|