0 引言 隨著人們生活水平的提高,消費結構發生了巨大變化,消費者用于娛樂方面的支出在總支出中所占的比例正在不斷擴大。掌上多媒體系統可以滿足人們對于試聽以及便攜的需求,另外還可以實現一些其他功能,如圖片瀏覽、網絡下載、以及影音錄制等。目前市場上的掌上多媒體系統多是Windows CE、Symbian、Palm OS等商用操作系統,其開放的程序不夠高,而且價格偏高,不適于第三方應用軟件的移植。ARM體系作為專用嵌入式系統設計的通用處理器內核,具備高性能、低功耗、易擴展的特點。本系統基于ARM9、嵌入式Linux操作系統設計并實現了一個更為開放的嵌入式平臺,來實現掌上多媒體系統的諸多功能。 1 多功能掌上媒體播放器系統的硬件設計 多功能掌上媒體播放器系統的硬件設計如圖1所示。LCD采用的是Sharp的TFT屏,3.52in,分辨率240×320;音頻控制器是IIS接口的音頻控制器,解碼芯片是UDA1314TS;另外擴展了用于視頻錄制的Philips的視頻解碼芯片SAA7113和ADI的JPEG壓縮芯片。視頻錄制的框圖如圖2所示。 2 多功能掌上媒體播放器系統的軟件設計 系統設計和軟件設計是本系統的難點。系統軟件設計的總體框架如圖3所示。 2.1 嵌入式Linux操作系統 Linux最初由Linux Torvalds編寫,后來在網絡上被眾多的Linux愛好者加以修改和維護,具有內核高效穩定、開源、可移植性強、內核可定制可裁剪、多線程多任務等特點,因此選擇其作為本媒體播放器系統的操作系統。 首先定制裁剪并移植了Linux2.6的內核,然后為使各硬件能正常工作編寫了鍵盤驅動、LCD驅動、觸摸屏驅動、音頻驅動、USB驅動等驅動。多功能掌上多媒體系統的正常工作首先是進入ARM-Linux操作系統,然后加載各個硬件的驅動程序并初始化各外圍設備,接著就進入基于QT/Embedded庫的Qtopia桌面系統編寫的GUI圖形界面程序的播放器,最后選擇要進行的操作。 對于Linux內核的移植首先要移植bootloader,系統采用的是VIVI,其功能包括:分區管理、參數管理、啟動Linux操作系統、文件系統管理、支持網絡、通過串口下載程序到Flash或者RAM等。建立嵌入式開發環境,使得能夠交叉編譯源代碼,對VIVI的源代碼進行交叉編譯,生成能在 ARM Linux上運行的bin文件,通過開發板的JTAG口將其燒寫到開發板的Flash中。 對內核的移植首先要對內核進行修改MAKEFILE文件指定編譯器以及目標平臺,然后配置內核,交叉編譯生成內核鏡像,通過UART口(串口)下載到開發板上。移植相應的文件系統。文件系統中的文件是數據的集合,不僅包含著文件中的數據,而且還有文件系統的結構,所有Linux用戶和程序看到的文件、目錄、軟連接及文件保護信息等都存儲在其中。在設計過程中把文件系統設置為可讀寫,這樣操作性強一些,在投入到生產中的時候應該把文件系統設置為只讀的,這樣整個掌上多功能媒體播放器的操作系統就加載好了。 2.2 驅動程序的設計 本系統共涉及到鍵盤驅動、觸摸屏驅動、LCD驅動、音頻驅動和USB驅動等驅動。因為多媒體功能是本系統的重點,所以播放器部分很重要,這里主要介紹音頻驅動的編寫。 目前Linux下常用的音頻驅動程序主要有兩種類型:OSS(Open Sound System) 和ALSA。最早出現的Linux上的編程接口是OSS,它由一套完整的內核驅動程序模塊組成,可為大多數音頻芯片驅動提供統一的編程接口。在嵌入式系統中,對于特定的處理器(如本系統采用的S3C2410),可以按照OSS接口標準來編寫音頻驅動程序,以滿足Linux上的應用程序。OSS接口已經足夠簡單,需要完成的主要的工作就是對音頻設備(本系統采用的是Philips的UDA1314TS)的read,write和ioctl等操作。 系統音頻驅動主要是對UDA1314TS進行驅動編寫,包括對UDA1314TS的L3接口的控制。首先初始化I/O和UDA1 314芯片,然后申請兩個DMA(Direct Memory Access)通道用于音頻傳輸(音頻數據的發送和接收都通過一個先入先出的隊列FIFO,但是只靠FIFO要保證音頻的連續播放是很困難的,所以申請 DMA通道來解決此問題)。OSS標準中由兩個最基本的音頻設備:混音器(Mixer)和數字信號處理器(DSP)又稱編解碼器,其中混音器主要用來控制輸入輸出音量的大小,只有open和release以及幾個接管OSS標準的iotcl。而DSF設備驅動的方法比較復雜,主要包括open、 release、read、write、poll、ioctl。其中主要在write和read方法中實現音頻的播放和錄音。以播放音頻來說明DSP驅動程序的編寫,對應了驅動程序中的open和write方法,它們利用DMA實現了音頻的播放。在open中,首先判斷設備打開的方法:讀取、寫入和讀/寫,分別對應音頻的錄音、播放以及錄音同時回放,然后申請兩個與音頻DMA緩沖區相關的,在初始化DMA時要用到,最后程序可以根據設備打開模式的初始化 S3C2410的工作模式,并清空所需的DMA緩沖區(在write方法被調用時創建)的數據結構,把它留給緩沖區創建。在這里,因為使用了兩個DMA音頻數據傳輸,DMA緩沖的建立發生在第一次調用wri te將音頻數據傳送到設備,而OSS驅動的調用者通常要在打開音頻設備時就期望獲得DMA緩沖的信息,然而因為緩沖尚未建立,會使得緩沖大小為0這個結果,解決辦法時在兩個與音頻DMA緩沖區相關的程序部分一定不能少了以下代碼: if(!output_stream.buffer&&audio_setup_buf(&out stream)) return-ENOMEM; 在Write方法中首先判斷設備文件打開的方式,具有write特性打開的設備才可以寫入,然后判斷是否沒有建立DMA緩沖區,若沒有,則通過 audio_setup_buf()來創建,定義一個結構體(audio_stream_t)的指針如下: 2.3 GUl程序的設計與播放器的實現 2.3.1 GUI程序的設計和實現 播放器的圖形界面在Qtopia視窗環境下運行,采用Qt/Embedded2.3.7作為底層圖形庫,用于生成用戶界面。QT是一個跨平臺的c++圖形用戶界面庫,Qt/Embedded是面向嵌入式系統的版本,其最大的特點就是使信號和槽用于對象間的通信,Qt的窗口部件有多個預定義的信號,槽是一個可以被調用處理特定信號的函數。Qt的窗口部件有多個預定義的槽,當一個特定事件發生的時候,一個信號被發射,對應感興趣的槽就會調用對應的相應函數。播放器界面主要包括主界面窗口、文件操作窗口、播放列表窗口。主界面窗口有一個顯示屏和一些控制按鈕,包括播放、暫停、快進、快退、下一首、上一首、音量調整以及播放進度條和播放時間顯示。文件操作窗口可以使用戶選擇要播放的文件。播放列表用來播放最近播放的五個多媒體文件。 2.3.2 播放器的實現 Linux下的播放器Mplayer是Linux上最優秀的多媒體播放器,它能夠使用眾多的編解碼器,支持多種輸出設備。可以播放市面上幾乎所有的音視頻格式。本系統選擇其作為播放器,對其進行優化和移植。進行的優化主要有: (1)Mplayer在系統上運行的時候顏色會有偏差,因此編程校正Mplayer的色彩; (2)Mplayer正常模式不能在FramBuffer的中間顯示,帶-fs的全屏參數播放后,只能將播放位置移到中間,并不放大,修改播放顯示位置,讓它和Nplayer圖形界面的調用相符合; (3)編程實現播放時對鍵盤事件正;; (4)Mplayer采用的自帶的mp3lib浮點音頻解碼庫的解碼效率很低,在播放音頻時會很卡,通過采用使用定點運算的libmad音頻解碼庫替代原來的mp3lib庫進行音頻解碼; (5)使用Mplayer的-input選項,通過FIFO從GUI向后端程序傳遞控制信息。通過優化后,對Mplayer交叉編譯,移植到系統上可以流暢地播放mp3等音頻文件以及mpeg-1、mpeg-2、avi等視頻格式。 2.4 影音錄制 影音錄制的系統框架見圖2。通過擴展用于視頻錄制的Philips的視頻解碼芯片SAA7113和ADI的JPEG壓縮芯片來實現。首先輸入的模擬視頻信號經過SAA7113轉換為數字信號,然后傳輸給ADI的JPEG壓縮芯片JPEG2000,壓縮為JPEG圖像信號,并通過擴展的總線接口傳輸到系統上。音頻信號則直接通過音頻輸入接口送到音頻解碼芯片,并轉化為數字信號進行編碼。編寫應用程序使傳到的音視頻數字信號一起轉化為Motion JPEG編碼的AVI格式的多媒體文件,并存入擴展的存儲設備(微硬盤或者MMC/SD卡),這樣就可以被Mplayer播放。 3 性能優化 盡管ARM9處理器主頻可以高達200MHz以上,但是為了降低功耗,本系統在保證滿足實時播放的前提下,對系統進行優化。所以,在一個資源受限的處理器上要實現多媒體文件的實時播放,性能優化成為關鍵。本系統主要通過解碼程序優化,打開Cache等措施來提高系統性能。 3.1 對解碼程序的優化 由于解碼過程絕大部分是計算,以MP3音頻文件為例,其解碼過程主要是高精度乘法和矢量運算,其中80%的CPU時間用于數值計算,因此對于解碼部分主要采用了以下方法進行優化: (1)整數運算。在沒有硬件浮點單元的CPU上,浮點運算是仿真方式,因此解碼代碼中應直接采用整數運算方式編碼,而避免浮點運算; (2)通過查表方式代替很多運算式獲取計算結果,對調用頻繁的小函數采用inline修飾; (3)關鍵代碼采用匯編語言編程,以獲得更高效的目標代碼,來提高系統的運行性能。 3.2 打開Cache ARM9處理器帶有獨立的16 kB數據Cache和16 kB的指令Cache。本系統中,打開指令Cache肯定能在一定程度上提高性能。至于數據Cache,由于從SD卡或者U盤讀進來解碼的數據使用完畢后就再也不會使用了,解碼產生的數據也是一樣,使用一次就會被丟棄,因此數據訪問的時間局限性基本是不存在的。但是,系統在訪問數據時存在很強的"空間局限性",所以打開數據Cache后可以提高性能,因為: (1)Cache和IDRAM之間通過Burst方式傳遞數據,提高了總線帶寬,從而降低讀數據的延遲。 (2)Cache一次讀128bit或256bit,當讀已在Cache中的數據時就會命中。 (3)通過WriteBuffer或WriteBack方式讀內存時,沒有寫DRAM的延遲。 但是這樣也會帶來數據不一致的問題,主要是DMA造成數據的不一致,因為SD卡或USB的傳輸是通過DMA進行的,其傳輸過程無需CPU干預,DMA操作直接訪問內存,但不會跟新Cache和寫緩存相應的內容,這樣就造成了數據的不一致,可用以下方法解決: (1)將SD卡或USB和CPU共享的控制數據空間設置為uncachable,否則無法保證CPU讀到的Cache中的數據是最新數據,從而可能造成系統運行錯誤。 (2)SD卡或USB輸入模塊通過DMA像主存傳輸文件數據時,寫數據的緩沖區是由文件系統提供的。該緩沖區的特點是存儲空間比較大而且是順序訪問的,可將其設置為cachable。 經過上述方法的優化以后,系統性能得到了大幅度的提高。經過測試表明,優化后解碼所需的時間為優化前的15%左右,均小于正常播放所需的時間,完全滿足實時播放的要求。 4 結束語 本系統以ARM9處理器為核心建立嵌入式多媒體系統,并在其上移植Mplayer播放器,擴展其功能,使mpeg-1、mpeg-2、avi等視頻格式以及MP3、WMA等音頻格式都能在其上流暢地播放,并實現了影音錄制功能。在測試中各模塊工作正常,達到了能全屏播放視頻,流暢播放音頻,能夠將攝像頭拍到的視頻傳送到Mplayer進行播放,能讀取外接U盤或者SD卡中的多媒體文件進行播放,能從網絡下載多媒體文件到擴展存儲設備被Mplayer播放的設計要求。隨著多媒體技術的廣泛應用,掌上多功能媒體播放器會有更廣闊的應用前景。 參考文獻 1. Rodriguez C S.Fischer G.Smolski S.陳莉君.賀炎.劉霞林 Linux 內核編程 2006 2. 深圳市優龍科技有限公司 ARM9 FS2410P應用教程 3. 孫瓊 嵌入式Linux應用程序開發詳解 2006 4. 劉淼 嵌入式系統接口設計與Linux驅動程序開發 2006 5. 倪繼利 QT 及Linux操作系統窗口設計 2006 6. 楊水清.張劍.施云非 ARM 嵌入式Linux系統開發技術詳解 2008 7. Kamal R.陳曙暉 嵌入式系統一體系結構、編程與設計 2006 作者:劉立昶 (武漢大學,物理科學與技術學院) 來源:電子技術 2009 36(9) |