摘 要:由于在原有的具有雙核結(jié)構(gòu)的數(shù)字信號(hào)處理芯片ADSP-BF561上運(yùn)行的嵌入式Linux 2.6系統(tǒng)的運(yùn)行效率不高,無法滿足網(wǎng)絡(luò)多媒體電話的實(shí)時(shí)需求。針對(duì)這個(gè)問題,本文在系統(tǒng)引導(dǎo)模式、程序的執(zhí)行模式、線程支持以及雙核通訊這幾個(gè)方面對(duì)Linux系統(tǒng)進(jìn)行了改進(jìn),從而提高了運(yùn)行效率以及滿足了實(shí)時(shí)應(yīng)用的需求。
關(guān)鍵詞:嵌入式;Linux;數(shù)字信號(hào)處理器
中圖分類號(hào):TP316.81
數(shù)字信號(hào)處理器(DSP)是指將信號(hào)以數(shù)字形式表示且處理的技術(shù)與理論,是對(duì)數(shù)字信號(hào)進(jìn)行處理的一種芯片。數(shù)字信號(hào)處理器是跟隨數(shù)字信號(hào)處理技術(shù)共同發(fā)展的。數(shù)字信號(hào)處理器除了應(yīng)用于音視頻領(lǐng)域,還廣泛應(yīng)用于通信、信息、控制、軍事、雷達(dá)、醫(yī)療、家用電器以及航空航天等多個(gè)領(lǐng)域。下面介紹的數(shù)字信號(hào)處理器的系統(tǒng)采用的是嵌入式Linux 2.6系統(tǒng),它在消費(fèi)類的數(shù)字多媒體產(chǎn)品中得到廣泛應(yīng)用。
1 嵌入式Linux的概述
嵌入式系統(tǒng)是一種以計(jì)算機(jī)技術(shù)為根本,以運(yùn)用為核心,軟硬件可被任意裁剪,適用于各類應(yīng)用系統(tǒng),對(duì)成本、功耗、功能、體積以及可靠性要求嚴(yán)格的特定計(jì)算機(jī)系統(tǒng)。它的計(jì)算機(jī)硬件系統(tǒng)是將功能軟件與操作系統(tǒng)集于一身,簡而言之就是將系統(tǒng)的硬件與應(yīng)用軟件一體化,具有自動(dòng)化高、軟件代碼小以及速度迅速等優(yōu)點(diǎn)。Linux是日趨盛行的一種操作系統(tǒng)平臺(tái),能被廣泛的用于各類產(chǎn)品與工程中。由于Linux系統(tǒng)的資源都是免費(fèi)開放的,因此為了滿足和適應(yīng)市場(chǎng)以及Linux應(yīng)用軟件的各種需求,它的配置與所支持的軟件組件都在不斷發(fā)展。目前Linux系統(tǒng)主要有實(shí)時(shí)增強(qiáng)和嵌入式這兩個(gè)版本。雖然Linux系統(tǒng)最初被用于PC體系組織結(jié)構(gòu)的操作系統(tǒng),但如今也被應(yīng)用于各種管理單元、控制器。嵌入式Linux最大的特點(diǎn)便是選擇性廣。
2 總體設(shè)計(jì)結(jié)構(gòu)
此系統(tǒng)主要采用的是ADSP-BF561芯片,它具備雙核CPU,主要由Core A與Core B這兩個(gè)可獨(dú)立進(jìn)行計(jì)算的Blackfin核構(gòu)成。每個(gè)Blackfin都包括四種片上存儲(chǔ)器,其中一個(gè)稱為L2是雙核共享的,其他三個(gè)空間里每個(gè)Blackfin核各占一份。此網(wǎng)絡(luò)多媒體電話的主要有音/視頻解碼、音/視頻編碼(G.711、H.263)、網(wǎng)絡(luò)通訊(H.323、PPPOE)等功能。用Linux系統(tǒng)來承擔(dān)網(wǎng)絡(luò)通訊功能,能很大程度地減輕軟件開發(fā)整體的工作量。對(duì)系統(tǒng)進(jìn)行總體設(shè)計(jì)時(shí),不僅平均地分配了BF561雙核芯片的計(jì)算任務(wù),而且定義Core A為供Linux 系統(tǒng)運(yùn)行的主導(dǎo)核,用來擔(dān)任系統(tǒng)的網(wǎng)絡(luò)通訊和解碼計(jì)算,同時(shí)定義Core B 來進(jìn)行運(yùn)算量大的編碼計(jì)算。
3 嵌入式Linux在DSP中的具體應(yīng)用
在對(duì)系統(tǒng)進(jìn)行詳細(xì)設(shè)計(jì)時(shí),有幾個(gè)問題我們要事先考慮好:第一,只要是通過VDSP工具所開發(fā)出來的編/解碼算法都不可在使用GCC工具編譯的Linux系統(tǒng)中直接運(yùn)行,再加上GCC工具的代碼優(yōu)化能力不強(qiáng),因而要往Linux系統(tǒng)中移植編/解碼算法所需的工作量太大。第二,Linux系統(tǒng)中沒有把不是GCC工具編譯出來的代碼加載到BF561芯片中的片內(nèi)存儲(chǔ)空間的方法。第三,由于現(xiàn)有的Linux系統(tǒng)中不支持線程,而且系統(tǒng)棧存在于片外的SDRAM中,因此導(dǎo)致訪問速度變慢。第四,BF561芯片所具備的原子操作功能在用在雙核互斥的訪問臨界資源的時(shí)候會(huì)引起死鎖。下面介紹一下具體的解決方案:
3.1 再階段引導(dǎo)方式
在處理音/視頻數(shù)據(jù)時(shí),網(wǎng)絡(luò)多媒體電話不僅要進(jìn)行較多的運(yùn)算,而且在計(jì)算方面要求速度較快。相比外部的SDRAM,BF561芯片的內(nèi)部L1存儲(chǔ)器對(duì)代碼的執(zhí)行速度要快很多,因此,要想提高速度,就該把全部的算法都加載到內(nèi)部的L1中。再加上與VDSP工具相比,開源社區(qū)所支持的GCC工具所具有的優(yōu)化能力較弱,因此算法最好采用VDSP工具來翻譯鏈接。要想將這些問題解決,必須用到再階段引導(dǎo)方式:在第一階段先對(duì)鏈接選項(xiàng)進(jìn)行更改,把音/視頻的解壓縮算法通過BF561的boot ROM加載到內(nèi)部L1準(zhǔn)確的位置上去;在第二階段把Linux系統(tǒng)的壓縮核心再加載到外部SDRAM的準(zhǔn)確位置上同時(shí)開始運(yùn)行。
一開始,建立一個(gè)VDSP的引導(dǎo)工程,往該工程里增添音/視頻的解壓縮的全部算法,再通過對(duì)鏈接選項(xiàng)的設(shè)置進(jìn)行正確的引導(dǎo)。所有的代碼、數(shù)據(jù)以及棧等的地址在鏈接文件中都進(jìn)行了明確的規(guī)定,再根據(jù)鏈接文件VDSP工具能生成與執(zhí)行程序映像,而且把地址信息都存儲(chǔ)在于映像文件的頭部。在系統(tǒng)引導(dǎo)的過程中,通過映像文件頭所顯示的信息,BF561的boot ROM可把數(shù)據(jù)和代碼加載到之前鏈接文件所指定的位置上去。然后再往外部SDRAM里復(fù)制上Flash上Linux的核心壓縮映像且啟動(dòng)核心運(yùn)行。但值得注意的是,在核心運(yùn)行被啟動(dòng)前,要先將Core B運(yùn)行啟動(dòng),當(dāng)Core B 啟動(dòng)后它的編譯算法便會(huì)進(jìn)入一個(gè)死循環(huán),從而重復(fù)執(zhí)行和接收Core A的命令。因?yàn)镃ore B是一個(gè)單獨(dú)的計(jì)算機(jī)單元,而且用于編譯算法的數(shù)據(jù)、棧以及代碼都存儲(chǔ)與Core B的內(nèi)部L1里,因此它的運(yùn)行不會(huì)對(duì)Core A造成干擾。
3.2 混合執(zhí)行多種代碼
通過研究發(fā)現(xiàn),非采用GCC編譯的程序能在Linux系統(tǒng)中正常運(yùn)行,只需將三個(gè)方面的問題解決好:
一方面,因?yàn)锽F561采用的是實(shí)地址空間,不需要對(duì)代碼進(jìn)行地址的重定向,只需要在用到VDSP或GCC的鏈接代碼時(shí)對(duì)編/解碼程序和Linux核心的存放位置進(jìn)行正確的設(shè)置,譬如data段、代碼段等,確保各個(gè)部分擁有各自獨(dú)立的空間而且互不沖突。由于Linux系統(tǒng)所管理的存儲(chǔ)空間為外部SDRAM和內(nèi)部L2,但編/解碼程序所管理的存儲(chǔ)空間大都聚集在L1里,因此能保證互不干擾。另一方面,要根據(jù)CPU的狀態(tài)來設(shè)置棧指針。由于BF561具有USER和SUP兩種不同的模式,它們有各自的棧指針。根據(jù)具體情況,我們?cè)O(shè)置解碼程序運(yùn)行于USER模式下,因?yàn)槔肬SER提供的棧,能夠避免解碼進(jìn)程占用CPU的時(shí)間過長。但是在USER模式下運(yùn)行的解碼程序,解碼程序會(huì)參與到調(diào)度中,勢(shì)必會(huì)被其他進(jìn)程搶占或中斷,因此一定要準(zhǔn)確地設(shè)置棧指針,不然的話會(huì)導(dǎo)致系統(tǒng)發(fā)生混亂。然而,要在Linux核心中運(yùn)行程序就得用到exccv系統(tǒng)調(diào)用,但是exccv要是更改起來比較困難?;谶@個(gè)問題,我們還是采用上面鏈接文件設(shè)置的方案,把解碼程序看做是一個(gè)函數(shù),來使用用戶進(jìn)程里的棧指針。并且在解碼程序運(yùn)行過程中棧的位置不發(fā)生改變,而只是運(yùn)行出棧和壓棧操作。
3.3 線程實(shí)現(xiàn)方案
由于Linux2.6系統(tǒng)不支持線程,要想增加此功能,就得更改核心系統(tǒng)和系統(tǒng)庫調(diào)用。一般Linux的進(jìn)程控制塊要向SDRAM進(jìn)行申請(qǐng),因而導(dǎo)致訪問速度非常慢。此外進(jìn)程的系統(tǒng)棧位于進(jìn)程控制塊的8KB地址空間的頂端,因此系統(tǒng)棧也位于SDRAM中,因而進(jìn)一步減慢進(jìn)程的運(yùn)行速度。而把主要進(jìn)程模塊以及init_task存儲(chǔ)于內(nèi)部L2中,能很大程度地加快進(jìn)程的執(zhí)行速度。在啟動(dòng)核心時(shí)需要用到init_task的系統(tǒng)棧,但是把init_task安置于L2中,就需要對(duì)編譯選項(xiàng)進(jìn)行更改設(shè)置。
3.4 DSP的雙核通訊方案
網(wǎng)絡(luò)多媒體電話系統(tǒng)進(jìn)行編碼的是Core B,而接收編碼數(shù)據(jù)的是Core A,然后利用Linux系統(tǒng)將編碼數(shù)據(jù)向網(wǎng)絡(luò)傳輸,因此把編碼后得到的數(shù)據(jù)傳輸給Linux系統(tǒng)是雙核通訊最主要的任務(wù)。即使編碼得到的數(shù)據(jù)量不是很大,但數(shù)據(jù)包的數(shù)目太多,在加上Linux系統(tǒng)自身的實(shí)時(shí)能力較差,要想進(jìn)行處理非常困難,因此雙核通訊需要用到環(huán)形緩沖方案。
緩沖區(qū)的讀寫是由Linux的設(shè)備文件來控制的。首要任務(wù)是讓緩沖區(qū)能進(jìn)行互斥訪問。雖然BF561已使用testset來進(jìn)行臨界資源的互斥訪問,但是由于testset指令僅僅只能用在單個(gè)核上程序之間的互斥訪問,假如雙核同一時(shí)間調(diào)用testset指令來訪問相同的臨界資源時(shí),就會(huì)導(dǎo)致系統(tǒng)死鎖。所以,緩沖區(qū)設(shè)備要通過讀點(diǎn)(read_point)、寫點(diǎn)(write_point)以及緩沖區(qū)的包數(shù)(n)三個(gè)變量來進(jìn)行互斥訪問。應(yīng)用程序要讀取緩沖區(qū)內(nèi)的數(shù)據(jù)包,就得通過緩沖區(qū)設(shè)備read函數(shù)阻塞。假如緩沖區(qū)內(nèi)有數(shù)據(jù),那么read函數(shù)就會(huì)將讀點(diǎn)的值返回,之后應(yīng)用程序就能直接從讀點(diǎn)讀取數(shù)據(jù)以及更改讀點(diǎn),一直到讀點(diǎn)遇到寫點(diǎn),然后應(yīng)用程序?qū)⒃俅握{(diào)用read函數(shù)阻塞從而等待數(shù)據(jù)。但是值得注意的是,讀點(diǎn)的指的更改是由Core A來完成的,而Core B只進(jìn)行讀取,而寫點(diǎn)卻正好相反,雙核不需要通過讀點(diǎn)和寫點(diǎn)之間的互斥訪問,都能對(duì)n的數(shù)據(jù)進(jìn)行讀取和更改,因此只要可以通過n來對(duì)緩沖區(qū)的數(shù)據(jù)是否為空進(jìn)行判斷就行了。在某些情況下,n的指可能是負(fù)值或者出現(xiàn)錯(cuò)誤,但因?yàn)锽F561具有對(duì)稱的多處理結(jié)構(gòu),而且單個(gè)核不會(huì)占用總線很長時(shí)間,不會(huì)讓這種錯(cuò)誤不會(huì)累積到緩沖區(qū)內(nèi)允許的最大包數(shù)的值,因此不會(huì)對(duì)緩沖區(qū)數(shù)據(jù)是否為空的判斷造成影響。
4 對(duì)系統(tǒng)性能進(jìn)行評(píng)價(jià)
通過以上的改進(jìn)方法,不僅實(shí)現(xiàn)了網(wǎng)絡(luò)多媒體電話的功能目標(biāo),而且減少了軟件系統(tǒng)開發(fā)所花費(fèi)的時(shí)間。第一,大大減輕了Linux系統(tǒng)運(yùn)行對(duì)編/解碼算法性能的影響,編碼算法在計(jì)算30幀/秒時(shí),Core B的占用率不超過40%,跟單獨(dú)運(yùn)行的編譯算的性能差不多。如果在Linux系統(tǒng)下,編譯算法全負(fù)荷地運(yùn)行,那么平均編碼幀率在150幀/秒左右,相比單獨(dú)運(yùn)行的平均性能,只有5幀/秒左右的差別。第二,編/解碼算法跟網(wǎng)絡(luò)傳輸間互不影響。因?yàn)锽F561雙核是串行訪問總線的,所以加入系統(tǒng)性能較差會(huì)導(dǎo)加重網(wǎng)絡(luò)丟包現(xiàn)象。再加上雙核通訊與進(jìn)程這些模塊能節(jié)省很多沒用的系統(tǒng)開銷,因此系統(tǒng)通過改進(jìn)后,只有網(wǎng)絡(luò)傳輸率超過800KB/s時(shí)才會(huì)導(dǎo)致UDP出現(xiàn)丟包,能滿足系統(tǒng)的需求。第三,網(wǎng)絡(luò)多媒體電話不僅具有較好的整體性能,而且有較大的擴(kuò)充空間。在進(jìn)行網(wǎng)絡(luò)傳輸和30幀/秒的編/解碼時(shí),Linux系統(tǒng)下Core A的scbedule函數(shù)僅占用不到5%的CPU內(nèi)存,解碼算法占用20%的CPU內(nèi)存,Core B的編譯算法僅占40%的CPU內(nèi)存??偟目磥?,CPU的占用率不高。
參考文獻(xiàn):
[1]關(guān)曉寧.基于嵌入式系統(tǒng)的數(shù)字信號(hào)處理平臺(tái)的分析[J].科技致富向?qū)В?012(30).
[2]鄭靜菡,唱江華,劉樹東,戴學(xué)豐.嵌入式下Linux系統(tǒng)設(shè)備驅(qū)動(dòng)程序的開發(fā)[J].齊齊哈爾大學(xué)學(xué)報(bào),2009(01).
[3]袁俊杰,曹作良.基于Linux嵌入式系統(tǒng)開發(fā)平臺(tái)的建立[J].天津理工大學(xué)學(xué)報(bào),2006(03).
作者簡介:麗娜(1980.7-),女,遼寧阜新人,達(dá)斡爾族,講師,研究生,研究方向:電子信息。