(東北電子技術(shù)研究所 錦州 121000)
基于WindML的圖形界面控制系統(tǒng)設(shè)計(jì)*
蒲元遠(yuǎn)吉高卿
(東北電子技術(shù)研究所 錦州 121000)
論文結(jié)合實(shí)際項(xiàng)目介紹了WindML軟件架構(gòu),如何安裝、配置和使用WindML,在應(yīng)用程序開發(fā)圖形界面軟件的流程,如何進(jìn)行多頁軟件設(shè)計(jì),WindML中的雙緩沖技術(shù),漢字的顯示以及幫組頁面的制作,并給出了程序運(yùn)行的相應(yīng)結(jié)果。
VxWorks;WindML雙緩沖;漢字顯示;多頁顯示;軟件架構(gòu)
ClassNumberTN97
VxWorks作為性能優(yōu)秀的嵌入式實(shí)時(shí)操作系統(tǒng),不論在可靠性、實(shí)時(shí)性、可裁減性方面,還是在開放性、易用性等方面都是相當(dāng)不錯(cuò)的。目前,嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在國防、航空和航天等領(lǐng)域中。VxWorks圖形開發(fā)組件WIND MEDIA LIBRARY是一個(gè)適用于VxWorks下開發(fā)圖形用戶界面的媒體庫,它提供了一系列的API函數(shù),功能強(qiáng)大,易于實(shí)現(xiàn)圖形用戶界面的開發(fā)。本文就圖形界面控制系統(tǒng)、WindML、應(yīng)用程序設(shè)計(jì)等,作進(jìn)一步的研究和探討[1]。
本系統(tǒng)由主顯控制器、從顯控制器以及分配器構(gòu)成,如圖1所示。主顯控制器硬件由CPU模塊、接口模塊和人機(jī)交付模塊(顯示屏幕、鍵盤)組成,它通過CPU模塊自帶的網(wǎng)口接收上級的控制、氣象等數(shù)據(jù),通過接口模塊接收分配器上報(bào)的信息以及與分顯控制器通信;主顯控制器和從顯控制器都使用了WindML設(shè)計(jì),通過鍵盤進(jìn)行頁面切換、輸入數(shù)據(jù)等,通過WindML圖形開發(fā)在屏幕上顯示信息[2]。

圖1 圖形界面控制系統(tǒng)構(gòu)成圖
3.1 圖形驅(qū)動(dòng)架構(gòu)
WindML圖形驅(qū)動(dòng)主要通過以下三層進(jìn)行通信:2D層、板級支持包及操作系統(tǒng)和圖形設(shè)備。體系結(jié)構(gòu)如圖2所示[3]。

圖2 圖形驅(qū)動(dòng)體系結(jié)構(gòu)
2D層與圖形驅(qū)動(dòng)程序通過UGL圖形接口結(jié)構(gòu)(ugl_ugi_driver結(jié)構(gòu))進(jìn)行通信,ugl_ugi_driver結(jié)構(gòu)在install-Dir/target/h/ugl/uglugi.h中定義。[2]圖形驅(qū)動(dòng)程序通過硬件提取API與操作系統(tǒng)通信,硬件提取API提供了允許圖形驅(qū)動(dòng)保留獨(dú)立于母板和CPU的接口。一般包含幾個(gè)可擴(kuò)展的寄存器作為圖形加速器,可加速的操作有線條、填充、顏色擴(kuò)充和光標(biāo)。
3.2 安裝使用步驟
本項(xiàng)目使用WindRiver的WindML3.0版本,集成在Tornado2.2.1上;配置好BSP包后,選擇配置WindML。如圖3所示,需要選擇所對應(yīng)的CPU平臺,圖形像素的大小,刷新率,是否需要鼠標(biāo)、鍵盤,最后在Bitmap Fonts頁中選擇需要添加的漢字。
4.1 應(yīng)用程序開發(fā)流程
用WindML API進(jìn)行繪圖操作的一般步驟:1)程序初始化,調(diào)用uglInitialize;2)設(shè)備驅(qū)動(dòng)裝載(uglRegistryFind),包括顯示、字體、事件處理、框架等;3)獲取ugl信息;4)創(chuàng)建圖形設(shè)備gc;5)設(shè)置字體;6)分配圖形空間,以及創(chuàng)建位圖;7)使用WindML的API函數(shù)輸出字符,像素描點(diǎn)等。流程如圖4所示[4]。

圖4 使用WindML進(jìn)行應(yīng)用程序開發(fā)的流程
在本項(xiàng)目中,使用了基于VxWorks的實(shí)時(shí)多任務(wù)設(shè)計(jì),顯示主處理函數(shù)為專用的任務(wù),它為循環(huán)不斷接收其他任務(wù)給顯示任務(wù)傳輸?shù)南?對消息進(jìn)行解析刷新顯示。根據(jù)不同的消息顯示不同的頁面和每頁中的內(nèi)容。應(yīng)用程序框架代碼如下:
UGL_FOREVER{
if(ERROR!=(msgQReceive(QueueDisplay,msgBuffer,MESSAGE_MAX_LENGTH,WAIT_FOREVER))){
msg=msgBuffer;
switch(*msg){
case H_SYSCONTROL:
SysToDraw(msg);
break;
case Cycle_Queue_ID:
CycleToDraw(msg);
break;
default:break;
} } }
4.2 多頁設(shè)計(jì)
為了使圖形控制系統(tǒng)功能顯示細(xì)化,操作更清晰,本項(xiàng)目圖形控制系統(tǒng)采用頁面擦除的方法來實(shí)現(xiàn)頁面的多級顯示。鍵盤設(shè)計(jì)為中斷方式,根據(jù)鍵盤輸入,顯示需要的頁面及信息。多頁選擇見圖4,選擇后進(jìn)入的主態(tài)勢頁面見圖5,也可以從主態(tài)勢頁面返回到選擇頁面,本項(xiàng)目多頁設(shè)計(jì)的層級化。主體代碼如下[5]:
intConnect(INUM_TO_IVEC(INT_VEC_GET(KBD_INT_LVL)),(VOIDFUNCPTR)IntKeyProg,0))//連接中斷服務(wù)程序
sysIntDisablePIC(KBD_INT_LVL);//關(guān)鍵盤中斷
KeyValue[0]=sysInByte(COMMAND_8042);//讀取鍵盤值
switch(KeyValue[0]){ //根據(jù)鍵盤值切換
case 0x1c:/** 回車 **/
KeyValue[1]=Key_Enter;
break;
case 0x0c:/** - **/
KeyValue[1]=Key_Minus;
break;
……
default:break;}
sysIntEnablePIC(KBD_INT_LVL);//開鍵盤中斷

圖5 圖形控制系統(tǒng)多頁設(shè)計(jì)效果圖

圖6 圖形控制系統(tǒng)多頁設(shè)計(jì)效果圖
4.3 雙緩存技術(shù)
本項(xiàng)目中的圖形控制系統(tǒng)采用了雙緩沖技術(shù),它不改變可見視頻緩存區(qū)起始地址,而是在內(nèi)存中開辟一塊與屏幕一樣大小的存儲(chǔ)區(qū)域,作為緩沖屏幕,同時(shí)將下一幀要顯示的圖像繪制到這個(gè)緩沖屏幕上面,在顯示的時(shí)候?qū)⑻摂M屏幕中的數(shù)據(jù)直接復(fù)制到可見視頻緩存區(qū)里。由于圖形繪制過程是在不可見的虛擬屏幕中進(jìn)行,所以可以消除屏幕的閃爍、抖動(dòng)。主體代碼如下[6]:
page[0]= UGL_PAGE_ZERO_ID;
page[0]= uglPageCreate(devId);
page[1]= uglPageCreate(devId);
uglPageDrawSet (devId, page[1]);
if (pageIndex == 0){
uglPageVisibleSet(devId, page[1]);
uglPageDrawSet(devId, page[0]);
pageIndex = 1;}
else {
uglPageVisibleSet(devId, page[0]);
uglPageDrawSet(devId, page[1]);
pageIndex = 0;}
4.4 如何顯示漢字
在圖形方式下,要顯示漢字,必須要有漢字字模,并通過適當(dāng)?shù)霓D(zhuǎn)換公式,將漢字編碼轉(zhuǎn)換為字模在字庫中的位移,然后選用讀寫指令實(shí)現(xiàn)字模的讀取和顯示。可以通過兩種方法輸出漢字,第一種是進(jìn)行二次開發(fā)以支持漢字的顯示,讀取字庫文件,使用uglPixelSet屏幕點(diǎn)函數(shù)輸出漢字;第二種是編輯VxWorks自帶的bmf字庫文件,通過WindML的支持,然后在程序中直接調(diào)用uglTextDrawW()顯示漢字。本項(xiàng)目采用后一種方式,實(shí)際使用步驟如下[7]:
1)修改bmf字庫文件。在$BASEDIR argetsrcuglfontsmf,找到需修改的bmf文件uflbr18.c,其中第一行注釋/* uflbr18.c - Lucida_Sans_Bold_18 font for BMF font driver */ ,“—”后面的“Lucida_Sans_Bold_18”將由WindML Configuration解釋為“Lucida_Sans_Bold_18”字體。配置圖見圖2。
2)修改漢字字體。uflbr18.c中,會(huì)看到如下格式的漢字信息,可以編輯我們所需要的漢字。其中index和page的值可在UltraEdit直接得到。然后設(shè)置長寬為16X16,最后32個(gè)字節(jié)可以通過取模工具(字模3增強(qiáng)版)獲得。
/********導(dǎo)************/
181, /* index */
188, /* page */
0, /* size (MSB)*/
36, /* size (LSB)*/
16, /* width */
16, /* height */
16, /* ascent */
0x04, 0x00, 0x04, 0x00, 0x04, 0x7e, 0x04, 0x92, 0x14, 0x92, 0x24, 0x92, 0x04, 0x92, 0x04, 0x92, 0x44, 0x92, 0x84, 0x92, 0x7f, 0x92, 0x04, 0xbf, 0x04, 0x82, 0x06, 0xe0, 0x04, 0x00, 0x00, 0x00
3)在應(yīng)用程序中使用。在應(yīng)用程序中使用漢字,需要如下幾個(gè)步驟:
(1)uglFontFindString(fontDrvId, "familyName=Lucida;pixelSize=18", &fontoilDef);//找到對應(yīng)文件
(2)font_oil = uglFontCreate(fontDrvId, &fontoilDef);//創(chuàng)建字體
(3)uglForegroundColorSet(gc, colorTable[DARKGRAY].uglColor);//設(shè)置顏色
(4)uglFontSet(gc, font_oil);//設(shè)置字體
(5)uglTextDrawW(gc, InfoTopPosX,InfoTopPosY,-1, "綜");//輸出漢字
uglTextDrawW(gc, InfoTopPosX,InfoTopPosY+Pix24,-1, "合");
4.5 如何顯示圖片
圖像數(shù)據(jù)是位圖矩陣的像素的顏色信息,圖像數(shù)據(jù)的存儲(chǔ)格式和含義,因表示像素顏色的位數(shù)不同而不同,對于沒有壓縮的圖像數(shù)據(jù),當(dāng)用1位表示一個(gè)像素顏色。同樣可以使用uglPixelSet屏幕點(diǎn)顯示函數(shù)顯示圖片。可以用取模工具,取出其數(shù)組,主體代碼如下[8]:
for(kk=0;kk<64*8;kk++){
for(jj=0;jj<8;jj++){
if(Bmp_boat[kk]&temp_bit){
uglPixelSet(gc,x+(kk%8)*8+jj,y+kk/8,colorTable[YELLOW].uglColor);
}
else {
uglPixelSet(gc,x+(kk%8)*8+jj,y+kk/8,colorTable[BLACK].uglColor);
}
temp_bit=temp_bit>>1;
}
temp_bit=0x80;
}
通過這種像素打點(diǎn)的方法,可以顯示任何內(nèi)容的點(diǎn)陣圖片。
4.6 幫助界面,如何顯示字符串
本項(xiàng)目中的圖形控制系統(tǒng)需要制作幫助文檔。通過讀取固定格式的bin文件,將讀取的字符逐個(gè)畫在界面上,并且計(jì)算字符的高度和寬度;如果bin文件過大,可設(shè)計(jì)成多個(gè)屏幕顯示,并通過輸入鍵盤切換顯示的幫助頁面。幫助頁面效果如圖6所示[9]。

圖7 圖形控制系統(tǒng)幫主頁面效果圖
cd("/ata0a/");//創(chuàng)建磁盤格式
UVHandle=open("/ata0a/help.bin",O_CREAT|O_RDWR,0);//打開len=lseek(UVHandle,0,SEEK_END);
read(UVHandle,HpBuffer,len);
//以下逐個(gè)顯示字符
for(i=0;i uglTextDraw(gc,10,displayHeight/5+15*i,PageArrow,strBuf); //此處可以使用uglTextDrawW顯示漢字 strBuf+=PageArrow;} close(UVHandle); ioctl(UVHandle,FIOFLUSH,0); 本文介紹了WindML軟件架構(gòu),安裝、配置WindML,結(jié)合項(xiàng)目開發(fā)實(shí)際,詳細(xì)闡述了圖形界面控制系統(tǒng)中所使用到的設(shè)計(jì)原理,所開發(fā)的圖形控制系統(tǒng)已成功運(yùn)用于某型號艦船的子系統(tǒng)控制中樞,界面美觀,運(yùn)行穩(wěn)定,達(dá)到了預(yù)期設(shè)計(jì)的目的。按照這些設(shè)計(jì)原理,也開發(fā)出其他型號的顯示控制器[10]。 [1]楊娟,王子勇,等.基于WindML的S3C2440顯示驅(qū)動(dòng)設(shè)計(jì)[J].硅谷,2011(9). [2]陳君,唐秀.VxWork下圖形用戶界面開發(fā)中雙緩沖技術(shù)應(yīng)用[J].微計(jì)算機(jī)信息,2006(8). [3]司江英,徐博寧,等.VxWorks系統(tǒng)下的漢字顯示[J].科技信息,2009(2). [4]WindML SDK 3.0 Programmer’s guide[Z]. Wind River Systems,Inc.,2002. [5]查振羽,熊華鋼.基于VxWorks實(shí)時(shí)控制系統(tǒng)中文交互界面開發(fā)平臺[J].計(jì)算機(jī)工程與設(shè)計(jì),2009(8). [6]趙漫菲,王光輝.基于嵌入式操作系統(tǒng)VxWorks的多級界面開發(fā)[J].計(jì)算機(jī)工程與設(shè)計(jì),2005(10). [7]陳君,唐秀明.VxWork下圖形用戶界面開發(fā)中雙緩沖技術(shù)應(yīng)用[J].微計(jì)算機(jī)信息,2006(8). [8]何江水,高有行.VxWorks漢字的顯示支持[J].微計(jì)算機(jī)信息,2005(5). [9]孔祥營,張保山,俞烈彬.VxWorks驅(qū)動(dòng)及分布式編程[M].北京:中國電力出版社,2007. [10]周祖洋,傅建剛,萬洋.Windows下的位圖在VxWorks中大字顯示的實(shí)現(xiàn)[J].應(yīng)用科技,2005(7). DesignofGraphicsControlSystemBasedonWindML PU Yuanyuan JI Gaoqing (Northeast Research Institute of Electronics Technology, Jinzhou 121000) According to the actual project experience, the architecture of WindML, how to setup, configure and use WindML develop environment, and the steps of develop graphics software in applications, how to develop Multi-page applications,how to use Double Buffering, Chinese character show and make helping page are introduced. At last, the results of the program running are given. VxWorks, WindML, double buffering, chinese character show, multi-page show, software architecture 2013年11月10日, :2013年12月23日 蒲元遠(yuǎn),男,工程師,研究方向:主要從事計(jì)算機(jī)軟件及應(yīng)用。 TN97DOI:10.3969/j.issn1672-9730.2014.05.0245 結(jié)語