WorldWind軟件在VxWorks下的移植
摘要:本文主要分析介紹了Vxworks系統(tǒng)的媒體庫(kù)WindML的結(jié)構(gòu)和特點(diǎn),并嘗試在嵌入式系統(tǒng)下,特別是在更具難度的Vxworks系統(tǒng)下,進(jìn)行移植WorldWind軟件。
隨著多媒體信息技術(shù)、互聯(lián)網(wǎng)技術(shù)、通信技術(shù)產(chǎn)品智能化趨勢(shì)的加強(qiáng),嵌入式系統(tǒng)以其占用內(nèi)存少、高性能、具有完全的可伸縮性、性能穩(wěn)定等特點(diǎn)得到了越來(lái)越廣泛的應(yīng)用。
其應(yīng)用主要包括網(wǎng)絡(luò)通信、航空航天、醫(yī)療儀器、狀態(tài)監(jiān)控以及消費(fèi)電子產(chǎn)品等領(lǐng)域。是美國(guó)VxWorks WindRiver System Inc.公司推出的強(qiáng)實(shí)時(shí)嵌入式操作系統(tǒng),它在高可靠、高實(shí)時(shí)性、高性能領(lǐng)域有獨(dú)到的優(yōu)勢(shì)和廣泛的應(yīng)用,特別是因?yàn)槌晒?yīng)用于火星探路器而名聲大噪。本文將主要圍繞VxWorks操作系統(tǒng)的圖形用戶接口的實(shí)現(xiàn)機(jī)制進(jìn)行分析,討論WorldWind軟件的移植。
1 WorldWind 軟件概述
NASA 就是我們所熟知的美國(guó)航天宇航局,在美國(guó)的高調(diào)宣傳之下與FBI 一樣如雷貫耳,能夠使用NASA 所開(kāi)發(fā)的軟件會(huì)不會(huì)有一種特殊的心情呢?WorldWind(簡(jiǎn)稱(chēng)WW)就是一款出身高貴的軟件,擁有NASA 的血統(tǒng)。同時(shí)它也是一款特殊的軟件。華麗的界面,出彩的圖象,完全自主的功能應(yīng)用,完全可以和GoogleEarth(簡(jiǎn)稱(chēng)GE)軟件相媲美。它與GoogleEarth最大的優(yōu)勢(shì)在于它的代碼開(kāi)源,這樣便于我們更加深入的了解他。這也是WW 比GE 更受大家的青睞的最重要的原因。同時(shí)也為我們這些愛(ài)好者移植該軟件提供了方便。
1.1 Add-On 功能
WW 是一款可以讓用戶通過(guò)從太空視角全面觀察地球表面的軟件,以他優(yōu)秀的衛(wèi)星圖庫(kù)與地形資料,通過(guò)3D 技術(shù)的應(yīng)用,讓用戶擁有身臨其境的感覺(jué)。與同類(lèi)型軟件一樣,亦可以使用圖層功能來(lái)方便使用者更快的索取自己想要的信息。不過(guò)不同的是WW 的圖層更為強(qiáng)大。這一切都得益于他的一個(gè)名為Add-On 的功能。此功能讓你不光可以享有官方所提供的圖層數(shù)據(jù),更為讓人興奮的是由于WW 為開(kāi)源軟件,他允許其他第三方人員為它提供編寫(xiě)的成品圖層功能。圖層是做什么用的?簡(jiǎn)單的來(lái)說(shuō),如果WW 給我們提供的模型球體是這款軟件的骨架,那么圖層則就是WW 的血脈,肌肉。兩者是相輔相成的關(guān)系,骨架固然重要,但是人與人的不同并不簡(jiǎn)單的體現(xiàn)在骨架上,更多的是依靠血脈,肌肉來(lái)體現(xiàn)。這個(gè)功能就是為了讓軟件更為豐滿,給于其很高的增長(zhǎng)潛力,而同類(lèi)型的 GE 則較之遜色的多了。
1.2 DDS 圖片WW 默認(rèn)設(shè)置中將下載到本地的圖片(一般是jpg 格式)轉(zhuǎn)換為dds 格式,這樣本地的cache 中都是dds 文件,一般說(shuō)來(lái)同樣分辨率的dds 文件比jpg 文件大。我通過(guò)修改默認(rèn)設(shè)置,不讓W(xué)W 轉(zhuǎn)為dds 格式,直接用jpg 格式,發(fā)現(xiàn)WW 中顯示效果差不多,地形也能正確渲染。
DDS 是DirectDraw Surface 的縮寫(xiě),它是DirectX 紋理壓縮(DirectX TextureCompression,簡(jiǎn)稱(chēng)DXTC)的產(chǎn)物。許多3D 軟件包括大部分游戲都用dds 格式,又稱(chēng)“貼圖”,許多fans 通過(guò)修改dds 文件可以生成特殊顯示效果。在WW 中也用到了其它格式的圖片:JPEG:(文件擴(kuò)展名為jpg 或jpeg)應(yīng)用最廣泛的圖片格式之一,它采用一種特殊的有損壓縮算法,將不易被人眼察覺(jué)的圖像顏色刪除,從而達(dá)到較大的壓縮比(可達(dá)到2:1 甚至40:1),所以“身材嬌小,容貌姣好”,特別適用于網(wǎng)絡(luò)環(huán)境。
PNG:與JPEG 格式類(lèi)似,網(wǎng)頁(yè)中有很多圖片都是這種格式,壓縮比高于GIF,支持圖像透明,可以利用Alpha 通道調(diào)節(jié)圖像的透明度。BMP:Windows 系統(tǒng)下的標(biāo)準(zhǔn)位圖格式,使用很普遍。其結(jié)構(gòu)簡(jiǎn)單,未經(jīng)過(guò)壓縮,一般圖像文件會(huì)比較大。它最大的好處就是能被大多數(shù)軟件“接受”,可稱(chēng)為通用格式。
GIF:分為靜態(tài)GIF 和動(dòng)畫(huà)GIF 兩種,支持透明背景圖像,適用于多種操作系統(tǒng),“體型”很小,網(wǎng)上很多小動(dòng)畫(huà)都是GIF 格式。其實(shí)GIF 是將多幅圖像保存為一個(gè)圖像文件,從而形成動(dòng)畫(huà),所以歸根到底GIF 仍然是圖片文件格式。
2 VxWorks 系統(tǒng)概述
VxWorks是美國(guó)WindRiver公司開(kāi)發(fā)的,具有工業(yè)領(lǐng)導(dǎo)地位的高性能嵌入式實(shí)時(shí)操作系統(tǒng)。VxWorks具有專(zhuān)門(mén)為實(shí)時(shí)嵌入式系統(tǒng)設(shè)計(jì)開(kāi)發(fā)的操作系統(tǒng)內(nèi)核,提供了高效的實(shí)時(shí)多任務(wù)調(diào)度、中斷管理,實(shí)時(shí)的系統(tǒng)資源以及實(shí)時(shí)的任務(wù)間通信?;赩xWorks操作系統(tǒng)的應(yīng)用程序可以在不同的CPU平臺(tái)上輕松移植。VxWorks只占用了很小的存儲(chǔ)空間,并可高度裁減,保證了系統(tǒng)能以較高的效率運(yùn)行。VxWorks以其卓越的性能被廣泛地應(yīng)用在通信、軍事、航空、航天等實(shí)時(shí)性要求極高因而普通操作系統(tǒng)難以勝任的領(lǐng)域中,美國(guó)的F-16戰(zhàn)斗機(jī)、B-2隱形轟炸機(jī)和愛(ài)國(guó)者導(dǎo)彈及火星控測(cè)器“探路者”上都使用了VxWorks。
在VxWorks的一般嵌入式應(yīng)用中,可以選擇Zinc For VxWorks或WindML來(lái)進(jìn)行圖形界面設(shè)計(jì),它們都是VxWorks中的可裁減的多媒體組件,都可以在VxWorks操作系統(tǒng)上以較低的系統(tǒng)開(kāi)銷(xiāo)實(shí)現(xiàn)豐富多彩的圖形界面。Zinc是一套完善的圖形用戶界面開(kāi)發(fā)工具,適用于為高性能嵌入式設(shè)備開(kāi)發(fā)低內(nèi)存開(kāi)銷(xiāo)、本地編譯的圖形化用戶接口。WindML是將 Zinc和硬件設(shè)備之間連接在一起的簡(jiǎn)捷高效的通用多媒體圖形庫(kù)。WindML主要提供了對(duì)芯片、輸入/輸出設(shè)備、音頻/視頻、幀緩沖器等的開(kāi)放的應(yīng)用程序接口(API)。因此,Zinc必須通過(guò)調(diào)用多媒體圖形庫(kù)WindML的應(yīng)用程序接口來(lái)實(shí)現(xiàn)其圖形功能。Zinc屬于高端應(yīng)用,組件的價(jià)格也較貴,而WindML在大多數(shù)情況下已經(jīng)足可以滿足應(yīng)用需求了。而且,WindML編程也比較靈活,有更大的自由度。因此,一般是選用WindML來(lái)作圖形界面設(shè)計(jì)。
3 WindML
3.1WindML 的系統(tǒng)結(jié)構(gòu)和功能
WindML是基于實(shí)時(shí)嵌入式操作統(tǒng)的多媒體應(yīng)用的支持鏈接庫(kù),它提供VxWorks基本的圖形、視頻、音頻技術(shù)支持,并提供定制設(shè)備驅(qū)動(dòng)的標(biāo)準(zhǔn)API接口,便于用戶根據(jù)自己的硬件設(shè)備開(kāi)發(fā)標(biāo)準(zhǔn)的設(shè)備驅(qū)動(dòng)。它是一個(gè)代碼量少、方便裁剪的提供語(yǔ)言接口的鏈接庫(kù)。圖1是基于VxWorks的WindML系統(tǒng)結(jié)構(gòu),它主要由SDK、DDK和硬件組成。其中SDK(SoftwareDevelopment Kit)是硬件無(wú)關(guān)層,它對(duì)用戶應(yīng)用程序提供統(tǒng)一的編程接口,包括圖形、視頻、音頻和事件驅(qū)動(dòng)服務(wù)器等,滿足用戶的基于事件驅(qū)動(dòng)的多媒體應(yīng)用的需要;DDK(DriverDevelopment Kit)是硬件相關(guān)層,即所謂的設(shè)備驅(qū)動(dòng)程序,它與用戶的硬設(shè)備相關(guān),一般應(yīng)由用戶根據(jù)具體硬件定制開(kāi)發(fā),它對(duì)硬件系統(tǒng)層輸出初始化信息、控制信息和用戶應(yīng)用程序的圖形人機(jī)接口,對(duì)SDK層提供設(shè)備無(wú)關(guān)的標(biāo)準(zhǔn)驅(qū)動(dòng)接口;硬件層一般由用戶定制,以實(shí)現(xiàn)相應(yīng)要求。
圖1 WindML系統(tǒng)結(jié)構(gòu)
3.2 WindML事件驅(qū)動(dòng)機(jī)制的設(shè)計(jì)思想
3.2.1 分層模塊化
WindML事件驅(qū)動(dòng)機(jī)制設(shè)計(jì)成幾個(gè)模塊,如I/O設(shè)備驅(qū)動(dòng)模塊、I/O子系統(tǒng)處理模塊、輸入監(jiān)測(cè)任務(wù)模塊、消息分發(fā)模塊等。在模塊內(nèi),又按功能劃分成更小的模塊。同時(shí),I/O設(shè)備驅(qū)動(dòng)與I/O子系統(tǒng)處理模塊嚴(yán)格處于系統(tǒng)的最下層,它用VxWorks系統(tǒng)的實(shí)時(shí)性設(shè)計(jì)來(lái)保證WindML事件的實(shí)時(shí)獲取,并且上層模塊可以不知道下層的實(shí)現(xiàn)細(xì)節(jié)。
3.2.2 任務(wù)隊(duì)列化
WindML應(yīng)用系統(tǒng)中,一定有很多任務(wù),因此,不管是系統(tǒng)任務(wù)或用戶任務(wù),都采用任務(wù)隊(duì)列方式管理本任務(wù)應(yīng)處理的事件,以保證事件的完整性和有效性。
3.2.3 低開(kāi)銷(xiāo)強(qiáng)實(shí)時(shí)性
為了減小模塊間的影響和保證強(qiáng)實(shí)時(shí)性,避免額外的拷貝操作,在實(shí)現(xiàn)中大量采用了指標(biāo)方式,特別是在I/O子系統(tǒng)和消息分發(fā)模塊中。
3.3 WindML事件驅(qū)動(dòng)機(jī)制的實(shí)現(xiàn)方案
WindML是一個(gè)基于事件驅(qū)動(dòng)的圖形庫(kù),它采用客戶/服務(wù)器模式,事件驅(qū)動(dòng)的原理如圖2。客戶應(yīng)用程序端負(fù)責(zé)窗口的繪制、窗口更新和其它用戶消息的響應(yīng),每一個(gè)窗體對(duì)象均建立一個(gè)消息隊(duì)列,用來(lái)接收服務(wù)器端的事件,從而進(jìn)行處理。服務(wù)器端主要由一個(gè)叫“輸入監(jiān)測(cè)任務(wù)”的任務(wù)來(lái)集中處理。輸入監(jiān)控任務(wù)依靠VxWorks I/O系統(tǒng)和select機(jī)制來(lái)采集I/O設(shè)備的實(shí)時(shí)事件,然后將其打包(或壓縮)成標(biāo)準(zhǔn)結(jié)構(gòu)的事件信息。打包后的信息通過(guò)uglEventPost函數(shù),發(fā)送到事件處理模塊中,在這個(gè)模塊中搜索應(yīng)用程序的所有窗口的所有消息隊(duì)列,判斷當(dāng)前事件應(yīng)該由哪一個(gè)窗口的消息隊(duì)列來(lái)接收,并將其發(fā)送到這個(gè)消息隊(duì)列中。這樣,這個(gè)客戶應(yīng)用程序就可以從消息隊(duì)列中取出消息信息,進(jìn)行相應(yīng)的處理。而且,這種分層模塊化機(jī)制也為用戶直接以事件方式在窗口間進(jìn)行通信提供了方便,只要調(diào)用uglEventPost函數(shù)即可,而不必經(jīng)過(guò)其它底層模塊。因此,在整個(gè)過(guò)程中,有幾部分的實(shí)現(xiàn)非常關(guān)鍵,包括I/O子系統(tǒng)與設(shè)備I/O驅(qū)動(dòng)、Select機(jī)制的實(shí)現(xiàn)方案、輸入監(jiān)測(cè)任務(wù)的實(shí)現(xiàn)機(jī)制、事件回調(diào)注冊(cè)與事件分發(fā)處理機(jī)制等。
圖2WindML 事件驅(qū)動(dòng)原理圖
3.3WindML 的使用
WindML 本身也具有可裁剪性和可配置性,以適應(yīng)不同的應(yīng)用要求。WindML 可以為在VxWorks 操作系統(tǒng)下開(kāi)發(fā)的軟件提供基本圖形、視頻和音頻文面的操作。WindML 適用于很多種CPU,可以提供獨(dú)立于硬件的代碼,同時(shí)它也支持鼠標(biāo)、鍵盤(pán)等輸入設(shè)備.WindML 的主要功能有二維圖形API,事件服務(wù),區(qū)域和窗口管理,多媒體,資源管理。
其中,二維圖形API 是最常用的部分,包括基本畫(huà)圖操作(畫(huà)線、矩形、橢圖、多邊形、點(diǎn)),選擇字體輸出文體,位圖,光標(biāo)管理,批量畫(huà)圖操作,圖形上下文,色彩管理,雙緩沖。事件服務(wù)程序是用來(lái)處理輸入設(shè)備的輸入請(qǐng)求的。它會(huì)把鍵盤(pán)、鼠標(biāo)等輸入的數(shù)據(jù)轉(zhuǎn)化為事件并且傳送給事件句柄,送到應(yīng)用隊(duì)列中。區(qū)域和窗口管理可以在界面上定義一個(gè)區(qū)域或多線程之間共享的窗口以供畫(huà)圖操作。多媒體API 支持NTSC,PAL,SECAM 等視頻制式,DSP 或混頻器兩種設(shè)備的音頻輸出,也支持JPEG 圖形格式。
WindML 的圖形界面是以像素為單位的,一般采用配色表來(lái)選擇顏色,先在配色表上配置好一種顏色的R、G、B 值,并用其在配色表中的索引值代表這種顏色。VxWorks 支持C 和C++。在WindML 的編程中,用C 和C++寫(xiě)的程序完全可以編譯通過(guò),但是C 語(yǔ)言中的printf()等函數(shù)是無(wú)法在圖形界面上輸出字符的,必須用WindML 提供的相應(yīng)函數(shù)才行。例如,uglTextDraw(ge,x1,y1,length,text)是在屏幕上(x1, y1)處用前面已設(shè)置的字體輸出英文字符串text。WindML 本身不支持中文,而在國(guó)內(nèi)的應(yīng)用場(chǎng)合,圖形界面中不能顯示中文往往是不符合要求的。這里可以用調(diào)用點(diǎn)陣字庫(kù)的辦法解決這樣的問(wèn)題。國(guó)家標(biāo)準(zhǔn)規(guī)定:漢字庫(kù)分94個(gè)區(qū),每個(gè)區(qū)有94 個(gè)漢字(以位作區(qū)別),每個(gè)漢字在漢字庫(kù)中有確定的區(qū)和位編號(hào)。每個(gè)漢字在庫(kù)中是以點(diǎn)陣字模型式存儲(chǔ)的,一般采用16×16 點(diǎn)陣(32 字節(jié))、24×24 點(diǎn)陣(72字節(jié)),每個(gè)點(diǎn)用一個(gè)二進(jìn)制位(0 或1)表示,地應(yīng)在屏幕上顯示出來(lái),就是相應(yīng)的漢字。
由于在中文環(huán)境下,輸入的是漢字的內(nèi)碼,我們必須將之轉(zhuǎn)換成區(qū)位碼,算出偏移量,從字庫(kù)中找到對(duì)應(yīng)的漢字,將其字模顯示即可。采用這種方法就需要有字庫(kù)文件,還必須自己寫(xiě)一個(gè)調(diào)用字庫(kù)顯示漢字的函數(shù)。這樣,在主程序中將需要顯示的漢字用引號(hào)表示成一個(gè)字符串,調(diào)用顯示漢字的函數(shù)即可。由于Tornado 中無(wú)法直接輸入中文,需要在其它的編輯器中(如UltraEdit)輸入漢字字符串保存后在Tornado 中打開(kāi)即可。
在圖形顯示前,必須先調(diào)用WindML 的API 函數(shù)UglInitialize()進(jìn)行初始化,然后還需要產(chǎn)生一個(gè)圖形環(huán)境,這樣才可以顯示自己的圖片。WindML 使用多線程和多任務(wù),但圖形的資源是一定的,為防止多線程之間產(chǎn)生資源沖突,需要使用互斥信號(hào)量鎖定資源。WindML 中,一般在使用一組畫(huà)圖函數(shù)前,用UglBatchStart(gc)通過(guò)互斥信號(hào)量鎖定圖形上下文、圖形設(shè)備及緩沖,并且隱藏光標(biāo)。在畫(huà)圖操作完成后,再用 UglBatchEnd(gc)釋放被鎖定資源以被其它的畫(huà)圖函數(shù)所使用。
4 結(jié)束語(yǔ)
該軟件的在VxWorks系統(tǒng)下的移植工作已基本實(shí)現(xiàn),圖形的顯示與瀏覽基本完成。不過(guò)現(xiàn)在顯示的圖形格式為JPEG,DDS格式圖形的顯示和軟件功能的完善正在進(jìn)行中。
與人玫瑰