李 寬, 張麗蕓, 陳玉沖
(1. 上海船舶運輸科學研究所 艦船自動化系統事業部, 上海 200135;2. 渤海造船廠集團設計院, 遼寧 葫蘆島 125004)
隨著航海事業的不斷發展,機艙監控系統在提高船舶的自動化水平、保證船舶安全航行等方面起著越來越重要的作用。隨著機艙自動化程度的不斷提高,實時嵌入式操作系統VxWorks在現代機艙監控系統中的應用越來越廣泛。機艙監控系統是由多種監控設備組合而成的復雜的人機系統,需機電人員對大量信息進行快速處理,因此對人機交互界面的要求較高。機艙監控系統需對機艙設備的參數、運行狀態和故障報警等信息進行顯示和操作,其圖形界面在滿足傳統圖形用戶界面方案要求的同時,還應具有很高的實時性和可擴展性。美國 WRS 公司開發的媒體庫(Wind Media Library,WindML)滿足這些要求,且具有占用內存少、可移植性強和高性能等特點。
VxWorks 是由美國風河公司開發的具有微內核、高可靠性、高實時性和可裁減等特點的嵌入式實時操作系統。VxWorks 提供有圖形開發組件WindML,在VxWorks一般的界面開發應用中,可使用WindML進行圖形界面設計。WindML可為運行在嵌入式系統上的多媒體應用程序提供支持,能用來開發可定制的標準化設備驅動程序的框架。
WindML包含軟件開發工具包(SDK)和驅動開發工具包(DDK)2個組件,其中:SDK用來實現應用程序的開發;DDK用來實現驅動程序的開發。WindML能滿足嵌入式計算機的所有圖形要求,保證開發人員在VxWorks實時操作系統上建造功能齊全、豐富多彩、可嵌入式的圖形界面。[1]
圖形顯示由底層圖片、文字、數字和符號等共同組成,原理見圖1。

圖1 圖形顯示原理
WindML本身不支持漢字顯示,可通過調用點陣字庫等方法來解決該問題。在中文環境下,輸入的是漢字的內碼,若要顯示漢字,需進行點陣尋址,找到該漢字內碼的字模信息在漢字庫中的位置,取出該字模信息進行點陣顯示。
WindML的圖形界面基于像素,用顏色匹配表說明位圖中的顏色。首先在顏色匹配表上設置一種顏色的紅、綠、藍亮度值,然后用位圖陣列中的每個像素值索引值代表該點在顏色匹配表中的顏色。
在顯示圖形之前,須先調用WindML的API函數uglInitialize()進行初始化,并產生一個圖形環境。在WindML中,一般會在使用一組畫圖函數之前用uglBatchStart()通過互斥信號量鎖定圖形上下文、圖形設備和緩沖,以防止多線程之間產生資源沖突。在畫圖操作完成之后,只有用 uglBatchEnd()釋放被鎖定的資源,其他畫圖函數才可使用。[2]
在船舶監控系統中,由于需實時采集、顯示機艙各設備的狀態和報警信息等,每次采集到數據和各界面互相切換時都要實時刷新畫面,而刷新時會出現畫面閃爍和劇烈抖動等現象。
畫面閃爍的根本原因是相鄰兩幀圖像之間存在巨大的差異。當需顯示新的圖形或使原來顯示的圖形發生變化時,需刷新背景,用背景顏色的畫刷將背景重新刷一遍,原圖形將被覆蓋,此時畫上新圖形即可完成圖形的刷新顯示或動態顯示。但是,由于背景顏色(一般是白色)與圖形顏色之間存在反差,在不斷地重復刷新、顯示的過程中會產生閃爍。閃爍本質上就是反差,反差越大,閃爍越厲害。因此,當窗口由于切換界面或數據更新需重繪時,首先清除顯示區背景色,然后才調用OnPaint函數進行重繪。背景色與繪圖內容的反差經常很大,導致背景色與顯示圖形在短時間內反復切換,造成顯示窗口出現閃爍現象。
針對刷新時畫面經常出現閃爍、抖動現象的問題,初期處理方式是以位圖背景的形式將圖形界面中的固定信息保存起來,調用uglDefault—BitmapSet()來實現,在該背景上動態刷新變化的測點信息、報警等。在該方式下刷新畫面時數據量會減少,畫面的閃爍現象有所改善,但因采集到的監測數據、設備的運行狀態等是實時變化的[3],且圖形緩沖顯示方式不變,小頻率或少量的數據刷新依然會引起畫面閃爍、抖動現象。
傳統的繪圖方式是采用單緩沖技術,而要解決圖形界面開發過程中刷新圖像時遇到的閃爍、抖動問題,需依靠雙緩存方式下的雙緩沖圖形刷新技術來實現。
在系統中,所有設備都有一個被稱為設備描述表的內存緩沖區與其對應。傳統的繪圖方式(單緩沖)是將圖形繪制在唯一的內存緩沖區中,由圖形設備接口自動將內存緩沖區中的圖像復制到顯存中顯示。雙緩沖圖形刷新技術在內存中有2片緩存區,分別為前端緩沖區和預先使用函數uglPageDrawSet( )手動建立的與前端緩沖區兼容的后端緩沖區。在繪圖過程中,首先將下一幀要顯示的圖像繪制到后端緩沖區,然后將后端緩沖區中的圖像復制到前端緩沖區,最后由圖形設備接口自動將前端緩沖區中待顯示的圖像復制到顯存中,完成圖形顯示。
單緩沖技術和雙緩沖技術基本原理見圖2。

a) 單緩沖技術b) 雙緩沖技術
圖2單緩沖技術和雙緩沖技術基本原理
在圖形界面開發過程中,在同一圖形界面背景下,背景圖、標題欄、單位和量程等圖像內容不變,需不斷進行更新的只有實時監測的數據。結合前述雙緩沖技術,可首先將固定不變的內容在不可見的后臺屏幕上分層繪制,然后將其他各層的內容透明粘貼到背景層的相應位置上,最后再將其復制到屏幕顯示區域進行顯示。由于固定不變的圖層無需重復繪制,因此可加快界面刷新速度。
1) 使用pentiumM 系列主板搭建硬件環境,并準備好VxWorks5.5.1 + WindML3.0 的軟件調試環境;
2) 新建一個 bootable 類型的 VxWorks 工程;
3) 將 gmch.o 庫文件添加到創建的工程路徑下;
4) 將 windML_INTEL_GMCH_DB.cfg 文件放置在C:Tornado221host esourcewindMLconfigdatabase 路徑下(本文假設VxWorks 開發環境安裝在 C:Tornado221 路徑下);
5) 將 gmchcfg.h 文件放置在C:Tornado221 argethugldrivergraphicsintel 路徑下(本文假設. VxWorks 開發環境安裝在 C:Tornado221 路徑下);
6) 對 WindML3.0 進行配置(見圖3)。

圖3 WindML3.0配置界面

圖4 雙緩沖流程圖
在具體實現中,首先創建前后雙緩沖頁, 調用uglPageDrawSet ( )函數設置活動的雙緩沖頁,使監測數據、設備狀態和報警等過程在Off_Screen(后臺)實現。在繪制當前數據信息時,調用函數uglPageDrawSet( )另外指定繪制下一圖形操作的頁面(緩沖)。在繪制完成之后,通過 uglPagevisableSet( )將后臺的圖像拷貝到前臺,實現雙緩沖圖形的界面切換。雙緩沖流程圖見圖4。
部分實現代碼如下:
dispPage[0] = UGL_PAGE_ZERO_ID;
dispPage[1] = uglPageCreate(devId);//創建雙緩沖頁
uglPageDrawSet(devId, dispPage[1]);//設置活動頁
sprintf(pageName, "%s%d%s","/ata0a/rPage",fileNumber,".jpg");
uglJpegToDDBFromFile (jpegId, pageFile, &jpegDdbPageId, UGL_NULL, 0, 0);
uglBitmapSizeGet(jpegDdbPageId, &jpegWidth1, &jpegHeight1);//圖片加載
uglTextDraw(gc, dispAna[i].xPoint, dispAna[i].yPoint, -1, LDMDispAna[i]);//字符顯示
uglTextDrawW(gc, dispAna[i].xPoint, dispAna[i].yPoint, dispAna[i].dispLen, (UGL_WCHAR *)dispAna[i].dispName[dispAna[i].value] );//漢字顯示
uglBitmapBlt(gc, jpegDdbPageId, 0, 0, jpegWidth1 - 1, jpegHeight1 - 1, UGL_DEFAULT_ID, 0, 0);//位圖繪制
if(pageIndex == 1)
{
uglPageVisibleSet(devId, dispPage[1]);
uglPageDrawSet(devId, dispPage[0]);
pageIndex = 0;
}
else
{
uglPageVisibleSet(devId, dispPage[0]);
uglPageDrawSet(devId, dispPage[1]);
pageIndex = 1;
}//雙緩沖界面切換
由于采用雙緩沖技術時需在內存中新建一個臨時緩存區,因此新建一個臨時位圖對象作為畫布并綁定臨時緩存區。繪圖在該緩存區中進行,當所有圖形繪制完成之后,將臨時緩存區中的位圖對象貼到顯示緩存區中,由于內存中的圖形與屏幕顯示的圖形差別很小,可消除刷新屏幕時出現的閃爍、抖動現象。
顯示單元監控界面效果見圖5。

圖5 顯示單元監控界面效果
隨著監控系統技術的不斷發展,對監控系統實用性、可靠性和安全性的要求會越來越高,惡劣環境下的機艙圖形界面開發技術將是今后一段時期的發展重點。本文對VxWorks圖形顯示原理、閃屏分析、雙緩沖技術及具體應用進行介紹,VxWorks提供的多媒體組件WindML雙緩沖技術已成功應用于實際工程開發中,取得了良好的效果。