文獻(xiàn)標(biāo)志碼: A
文章編號: 0258-7998(2013)02-0006-03
目前市場上有良好控制功能的處理器很多,但是這些處理器大多在數(shù)據(jù)處理能力方面略顯不足。因此,美國德州儀器(TI)公司于2009推出了一款多核處理器OMAP3530,它采用了600 MHz ARM Cortex-A8內(nèi)核與420 MHz TMS320C64+TM DSP雙核結(jié)構(gòu)[1-2]。由于ARM在工業(yè)控制方面具有很大的優(yōu)勢以及DSP具有良好的數(shù)據(jù)處理能力,所以O(shè)MAP3530在嵌入式系統(tǒng)的應(yīng)用開發(fā)方面有著廣泛的應(yīng)用前景和技術(shù)潛力。
要使OMAP3530發(fā)揮ARM+DSP雙核架構(gòu)的優(yōu)勢,必須要使ARM和DSP協(xié)同工作。目前關(guān)于如何使ARM和DSP協(xié)同工作的參考資料不多,因此本文在研究實(shí)踐的基礎(chǔ)上,就如何搭建協(xié)同開發(fā)環(huán)境以及ARM和DSP協(xié)同開發(fā)方法進(jìn)行了說明。
1 開發(fā)環(huán)境的搭建
1.1 PC端系統(tǒng)的搭建
OMAP3530幾乎支持所有嵌入式操作系統(tǒng)(例如WinCE、Symbian OS、EPOC、Linux等),由于大部分嵌入式操作系統(tǒng)都要收費(fèi),所以這里采用Linux系統(tǒng),它不僅應(yīng)用廣泛,而且免費(fèi)和開源。
為了能夠開發(fā)OMAP3530,首先要搭建開發(fā)環(huán)境,在PC端,需要安裝虛擬機(jī)VMware Workstation,配置超級終端;然后在虛擬機(jī)上安裝Linux操作系統(tǒng)。除此之外,還需要在Linux系統(tǒng)上安裝交叉編譯器、NFS服務(wù)器、FTP服務(wù)器等一些必要的開發(fā)工具。
1.2 OMAP3530系統(tǒng)啟動方式及分析
OMAP3530上運(yùn)行的Linux系統(tǒng)的組成結(jié)構(gòu)如圖1所示。其中,x-loader是一級引導(dǎo)程序,主要作用是初始化CPU和拷貝u-boot到內(nèi)存中運(yùn)行[3],然后把控制權(quán)交給u-boot。u-boot為二級引導(dǎo)程序,主要用于與用戶進(jìn)行交互,以及提供鏡像更新、引導(dǎo)內(nèi)核等功能。kernel為Linux內(nèi)核,是操作系統(tǒng)的核心,負(fù)責(zé)管理系統(tǒng)的進(jìn)程、內(nèi)存、設(shè)備驅(qū)動程序、文件和網(wǎng)絡(luò)系統(tǒng),決定著系統(tǒng)的性能和穩(wěn)定性。rootfs為根文件系統(tǒng),在嵌入式Linux操作系統(tǒng)中,文件系統(tǒng)作為操作系統(tǒng)的重要組成部分,用于控制對數(shù)據(jù)文件及設(shè)備的存取,并提供對文件和目錄的分層組織形式、數(shù)據(jù)緩沖以及對文件存取權(quán)限的控制。根文件系統(tǒng)是Linux系統(tǒng)不可或缺的組件,在嵌入式Linux中,內(nèi)核在啟動期間,必須調(diào)用根文件系統(tǒng)才能啟動。Linux系統(tǒng)將自身劃分為兩部分,一部分為核心軟件,即kernel(也稱作內(nèi)核空間);另一部分為普通應(yīng)用程序,這部分稱為用戶空間(user area)。
可以通過配置及編譯x-loader、u-boot、kernel、busybox源碼文件來獲得OMAP3530所需的鏡像文件,然后把鏡像文件拷貝進(jìn)SD卡,這樣就可通過SD卡啟動Linux系統(tǒng)。
為了便于開發(fā),通常使用交叉網(wǎng)線連接PC和OMAP3530開發(fā)板,然后通過由NFS掛載根文件系統(tǒng)的方法來啟動Linux系統(tǒng)。該方法的好處是能直接在虛擬機(jī)中修改OMAP3530端Linux的文件系統(tǒng),就可以直接在PC上開發(fā)OMAP3530端的程序。
2 搭建ARM與DSP之間的橋梁
2.1 DVSDK簡介
為了使ARM與DSP建立連接,TI公司推出了DVSDK(Digital Video Software Development Kit)軟件開發(fā)包,它集成了多種軟件工具,包括支持獨(dú)立DSP處理器和ARM處理器組件以及雙核系統(tǒng)交互組件,各個組件之間緊密聯(lián)系,形成了完整的開發(fā)套件[4-5]。DVSDK部分軟件模塊介紹如下。
(1)DSP/BIOS for Linux:是一個可擴(kuò)縮的實(shí)時DSP核,可以理解為在DSP端獨(dú)立運(yùn)行的實(shí)時系統(tǒng)。
(2)TI Codegen Tools for Linux:是Linux環(huán)境下DSP程序的編譯器、連接器及相關(guān)工具,類似于Windows環(huán)境下的CCS軟件(在Windows環(huán)境下的CCS軟件用來編譯和調(diào)試DSP程序)。
(3)Framework Component:負(fù)責(zé)DSP端的Memory和DMA資源管理。
(4)xDAIS:定義了DSP算法接口的標(biāo)準(zhǔn)。
(5)DSP/BIOS Link:是實(shí)現(xiàn)ARM和DSP之間通信的底層軟件。
(6)Codec Engine:是DVSDK的核心,所有其他軟件模塊基本上都是圍繞Codec Engine來設(shè)計(jì)的。
2.2 DVSDK的安裝與編譯
首先要在虛擬機(jī)上的Linux系統(tǒng)中安裝DVSDK軟件包。DVSDK軟件包可以從TI公司的官方網(wǎng)站上獲取,軟件包獲取后執(zhí)行如下命令即可實(shí)現(xiàn)其安裝:
./ dvsdk_setuplinux_3_01_00_10.bin
完成安裝后會生成一個文件夾,里面包含了所有DVSDK軟件模塊。然后還需要對DVSDK內(nèi)部的一些文件進(jìn)行配置,主要的配置是指定各個模塊編譯所需要的編譯工具以及相應(yīng)目錄的相對位置,配置好以后就可以對各個模塊進(jìn)行編譯。
編譯成功后,在DVSDK相應(yīng)的目錄下會生成cmem.ko(內(nèi)存管理模塊)、dsplink.ko(ARM與DSP連接模塊)、lpm_omap3530.ko(電源管理模塊)等內(nèi)核模塊。為了使ARM與DSP建立連接,必須要有DSPLINK模塊的支持,系統(tǒng)需要通過DSPLINK來完成ARM與DSP端之間底層的數(shù)據(jù)通信。DSPLINK提供了一套通用的API,從應(yīng)用層抽象出ARM與DSP的物理連接特性,從而降低用戶開發(fā)程序的難度。
2.3 內(nèi)存的分配
由于ARM端運(yùn)行的是Linux操作系統(tǒng),DSP端運(yùn)行的是DSP/BIOS操作系統(tǒng),為了使兩個系統(tǒng)協(xié)同工作,兩者之間需要開辟一塊ARM端和DSP端共享的內(nèi)存空間。這部分的工作由CMEM來完成,所以在加載cmem.ko時,需要對其進(jìn)行內(nèi)存分配設(shè)置。CMEM還能夠?qū)?nèi)存的物理地址轉(zhuǎn)化為操作系統(tǒng)能夠識別的虛擬地址,避免了操作系統(tǒng)對物理地址的直接訪問。這樣無論是Linux操作系統(tǒng)還是DSP/BIOS操作系統(tǒng)都是通過CMEM對內(nèi)存進(jìn)行管理。
加載完上述各個功能模塊后就可以開發(fā)可供ARM端調(diào)用的DSP程序。
3 供ARM端調(diào)用的DSP程序的開發(fā)
為了開發(fā)可供ARM端調(diào)用的DSP程序,必須了解Codec Engine。Codec Engine是連接ARM和DSP協(xié)處理器的橋梁,是介于應(yīng)用層(ARM端的應(yīng)用程序)和信號處理層(DSP端的算法程序)之間的軟件模塊。在編譯DSP端和ARM端程序時,都需要Codec Engine的支持。當(dāng)ARM端應(yīng)用程序調(diào)用Codec Engine的VISA(Video,Image,Speech,Audio)API,例如圖2中VIDENC_process(a,b,c)時,Codec Engine的stub(ARM端)會把參數(shù)a、b、c以及要調(diào)用DSP端的process信息打包,通過消息隊(duì)列(message queue)傳遞到DSP。Codec Engine的skeleton(DSP端)會解開這個參數(shù)包,把參數(shù)a、b、c轉(zhuǎn)換成DSP端對應(yīng)的參數(shù)x、y、z;DSP端的server會根據(jù)process這一信息創(chuàng)建一個DSP端的process(x,y,z)任務(wù),最終實(shí)現(xiàn)VIDENC_process(a,b,c)的操作。
DSP端的算法程序開發(fā)一般有兩種:
(1)在Windows的CCS下直接開發(fā)DSP端運(yùn)行的程序,然后打包成固定的格式,使其能夠被Codec Engine調(diào)用。這種方法的優(yōu)點(diǎn)是能夠通過優(yōu)化程序最大限度地提高DSP的運(yùn)行效率。目前大多數(shù)DSP雖然都支持C語言編程,但是在實(shí)際工程應(yīng)用中,具體的算法模塊以及比較耗時的功能模塊還是采用匯編語言來編寫。這是因?yàn)镃語言雖然具有易讀性、可移植性等優(yōu)點(diǎn),但是它不便于對系統(tǒng)硬件資源的直接控制,無法發(fā)揮DSP自身的特點(diǎn),無法充分利用DSP系統(tǒng)結(jié)構(gòu)中有限的資源。特別是在硬實(shí)時性系統(tǒng)中,用匯編語言進(jìn)行編程可利用DSP自身硬件結(jié)構(gòu)的特點(diǎn)對匯編程序進(jìn)行優(yōu)化和精簡,往往能夠使一些復(fù)雜的算法及功能模塊在實(shí)時性方面取得非常好的效果。但是這種方法也有其缺點(diǎn),那就是算法程序的可移植性非常差,基本上針對每一個應(yīng)用都要開發(fā)不同的DSP程序,這是比較致命的問題。
(2)通過DVSDK開發(fā)套件在宿主機(jī)上直接開發(fā)算法程序,其開發(fā)方法遵照TI公司制訂的基于eXpressDSP算法互用性標(biāo)準(zhǔn)。這種方法雖然會使DSP的運(yùn)行效率受到一定影響,但為系統(tǒng)的整體性能和二次開發(fā)提供了可靠的保證。下面以示例程序來說明其開發(fā)方法。
①進(jìn)入DVSDK安裝后生成目錄/dvsdk_3_01_00_10/codec_engine_2_25_02_11/examples/ti/sdo/ce/examples/codecs/imgdec_copy,如圖3所示。該目錄下的程序是DVSDK提供的示例程序,其中imgdec_copy.c是DSP端的程序,該程序?qū)崿F(xiàn)了將ARM端讀進(jìn)的in.bmp圖像拷貝成當(dāng)前目錄下的out.bmp圖像的功能。
③編譯ARM端的程序。進(jìn)入ARM端應(yīng)用程序目錄/dvsdk_3_01_00_10/codec_engine_2_25_02_11/examples/ti/sdo/ce/examples/apps/image_copy,如圖7所示。該目錄下app.c是在ARM端運(yùn)行的應(yīng)用程序,該程序的主要功能就是從當(dāng)前目錄讀取in.bmp文件,然后調(diào)用DSP端的程序,讓DSP去實(shí)現(xiàn)圖像拷貝。對該程序進(jìn)行編譯(執(zhí)行make命令),編譯完成后會在該目錄的bin子目錄下生成ARM端的應(yīng)用程序app_remote.xv5T,如圖8所示。
本文闡述了OMAP3530中兩種ARM和DSP協(xié)同開發(fā)方法,并對其進(jìn)行了比較。一種方法是在CCS下直接開發(fā)DSP端的算法程序,其優(yōu)點(diǎn)是能夠通過優(yōu)化算法程序最大限度地提高DSP端數(shù)字信號處理的效率,缺點(diǎn)是算法程序的可移植性差。另一種方法是利用DVSDK開發(fā)套件開發(fā)算法程序,其優(yōu)點(diǎn)是算法的可移植性好,能夠有效縮短開發(fā)周期,但是無法對DSP端運(yùn)行的算法程序進(jìn)行實(shí)時在線調(diào)試,而且DSP多流水線處理方式的優(yōu)勢難以得到充分發(fā)揮,所以算法程序也并不是最優(yōu)化的。在實(shí)際開發(fā)中,可以根據(jù)具體的情況選擇一種開發(fā)方法。
參考文獻(xiàn)
[1] 冼進(jìn),畢盛.基于OMAP3530雙核的嵌入式系統(tǒng)實(shí)驗(yàn)平臺設(shè)計(jì)[J].信息系統(tǒng)工程,2010(7):72-73.
[2] 王偉,劉培德.OMAP3530平臺移動多媒體的視頻解碼方案[J].單片機(jī)與嵌入式系統(tǒng),2010(6):31-34.
[3] 宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2010.
[4] 張起貴,張勝,張剛.最新DSP技術(shù)[M].北京:國防工業(yè)出版社,2009.
[5] 紀(jì)震,曾啟明.OMAP3原理及系統(tǒng)設(shè)計(jì)[M].北京:科學(xué)出版社,2011.