(東北電子技術(shù)研究所 錦州 121000)
基于WindML的圖形界面控制系統(tǒng)設(shè)計(jì)*
蒲元遠(yuǎn)吉高卿
(東北電子技術(shù)研究所 錦州 121000)
論文結(jié)合實(shí)際項(xiàng)目介紹了WindML軟件架構(gòu),如何安裝、配置和使用WindML,在應(yīng)用程序開(kāi)發(fā)圖形界面軟件的流程,如何進(jìn)行多頁(yè)軟件設(shè)計(jì),WindML中的雙緩沖技術(shù),漢字的顯示以及幫組頁(yè)面的制作,并給出了程序運(yùn)行的相應(yīng)結(jié)果。
VxWorks;WindML雙緩沖;漢字顯示;多頁(yè)顯示;軟件架構(gòu)
ClassNumberTN97
VxWorks作為性能優(yōu)秀的嵌入式實(shí)時(shí)操作系統(tǒng),不論在可靠性、實(shí)時(shí)性、可裁減性方面,還是在開(kāi)放性、易用性等方面都是相當(dāng)不錯(cuò)的。目前,嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在國(guó)防、航空和航天等領(lǐng)域中。VxWorks圖形開(kāi)發(fā)組件WIND MEDIA LIBRARY是一個(gè)適用于VxWorks下開(kāi)發(fā)圖形用戶(hù)界面的媒體庫(kù),它提供了一系列的API函數(shù),功能強(qiáng)大,易于實(shí)現(xiàn)圖形用戶(hù)界面的開(kāi)發(fā)。本文就圖形界面控制系統(tǒng)、WindML、應(yīng)用程序設(shè)計(jì)等,作進(jìn)一步的研究和探討[1]。
本系統(tǒng)由主顯控制器、從顯控制器以及分配器構(gòu)成,如圖1所示。主顯控制器硬件由CPU模塊、接口模塊和人機(jī)交付模塊(顯示屏幕、鍵盤(pán))組成,它通過(guò)CPU模塊自帶的網(wǎng)口接收上級(jí)的控制、氣象等數(shù)據(jù),通過(guò)接口模塊接收分配器上報(bào)的信息以及與分顯控制器通信;主顯控制器和從顯控制器都使用了WindML設(shè)計(jì),通過(guò)鍵盤(pán)進(jìn)行頁(yè)面切換、輸入數(shù)據(jù)等,通過(guò)WindML圖形開(kāi)發(fā)在屏幕上顯示信息[2]。
圖1 圖形界面控制系統(tǒng)構(gòu)成圖
3.1 圖形驅(qū)動(dòng)架構(gòu)
WindML圖形驅(qū)動(dòng)主要通過(guò)以下三層進(jìn)行通信:2D層、板級(jí)支持包及操作系統(tǒng)和圖形設(shè)備。體系結(jié)構(gòu)如圖2所示[3]。
圖2 圖形驅(qū)動(dòng)體系結(jié)構(gòu)
2D層與圖形驅(qū)動(dòng)程序通過(guò)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)程序通過(guò)硬件提取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所示,需要選擇所對(duì)應(yīng)的CPU平臺(tái),圖形像素的大小,刷新率,是否需要鼠標(biāo)、鍵盤(pán),最后在Bitmap Fonts頁(yè)中選擇需要添加的漢字。
4.1 應(yīng)用程序開(kāi)發(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)用程序開(kāi)發(fā)的流程
在本項(xiàng)目中,使用了基于VxWorks的實(shí)時(shí)多任務(wù)設(shè)計(jì),顯示主處理函數(shù)為專(zhuān)用的任務(wù),它為循環(huán)不斷接收其他任務(wù)給顯示任務(wù)傳輸?shù)南?對(duì)消息進(jìn)行解析刷新顯示。根據(jù)不同的消息顯示不同的頁(yè)面和每頁(yè)中的內(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 多頁(yè)設(shè)計(jì)
為了使圖形控制系統(tǒng)功能顯示細(xì)化,操作更清晰,本項(xiàng)目圖形控制系統(tǒng)采用頁(yè)面擦除的方法來(lái)實(shí)現(xiàn)頁(yè)面的多級(jí)顯示。鍵盤(pán)設(shè)計(jì)為中斷方式,根據(jù)鍵盤(pán)輸入,顯示需要的頁(yè)面及信息。多頁(yè)選擇見(jiàn)圖4,選擇后進(jìn)入的主態(tài)勢(shì)頁(yè)面見(jiàn)圖5,也可以從主態(tài)勢(shì)頁(yè)面返回到選擇頁(yè)面,本項(xiàng)目多頁(yè)設(shè)計(jì)的層級(jí)化。主體代碼如下[5]:
intConnect(INUM_TO_IVEC(INT_VEC_GET(KBD_INT_LVL)),(VOIDFUNCPTR)IntKeyProg,0))//連接中斷服務(wù)程序
sysIntDisablePIC(KBD_INT_LVL);//關(guān)鍵盤(pán)中斷
KeyValue[0]=sysInByte(COMMAND_8042);//讀取鍵盤(pán)值
switch(KeyValue[0]){ //根據(jù)鍵盤(pán)值切換
case 0x1c:/** 回車(chē) **/
KeyValue[1]=Key_Enter;
break;
case 0x0c:/** - **/
KeyValue[1]=Key_Minus;
break;
……
default:break;}
sysIntEnablePIC(KBD_INT_LVL);//開(kāi)鍵盤(pán)中斷
圖5 圖形控制系統(tǒng)多頁(yè)設(shè)計(jì)效果圖
圖6 圖形控制系統(tǒng)多頁(yè)設(shè)計(jì)效果圖
4.3 雙緩存技術(shù)
本項(xiàng)目中的圖形控制系統(tǒng)采用了雙緩沖技術(shù),它不改變可見(jiàn)視頻緩存區(qū)起始地址,而是在內(nèi)存中開(kāi)辟一塊與屏幕一樣大小的存儲(chǔ)區(qū)域,作為緩沖屏幕,同時(shí)將下一幀要顯示的圖像繪制到這個(gè)緩沖屏幕上面,在顯示的時(shí)候?qū)⑻摂M屏幕中的數(shù)據(jù)直接復(fù)制到可見(jiàn)視頻緩存區(qū)里。由于圖形繪制過(guò)程是在不可見(jiàn)的虛擬屏幕中進(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 如何顯示漢字
在圖形方式下,要顯示漢字,必須要有漢字字模,并通過(guò)適當(dāng)?shù)霓D(zhuǎn)換公式,將漢字編碼轉(zhuǎn)換為字模在字庫(kù)中的位移,然后選用讀寫(xiě)指令實(shí)現(xiàn)字模的讀取和顯示??梢酝ㄟ^(guò)兩種方法輸出漢字,第一種是進(jìn)行二次開(kāi)發(fā)以支持漢字的顯示,讀取字庫(kù)文件,使用uglPixelSet屏幕點(diǎn)函數(shù)輸出漢字;第二種是編輯VxWorks自帶的bmf字庫(kù)文件,通過(guò)WindML的支持,然后在程序中直接調(diào)用uglTextDrawW()顯示漢字。本項(xiàng)目采用后一種方式,實(shí)際使用步驟如下[7]:
1)修改bmf字庫(kù)文件。在$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”字體。配置圖見(jiàn)圖2。
2)修改漢字字體。uflbr18.c中,會(huì)看到如下格式的漢字信息,可以編輯我們所需要的漢字。其中index和page的值可在UltraEdit直接得到。然后設(shè)置長(zhǎng)寬為16X16,最后32個(gè)字節(jié)可以通過(guò)取模工具(字模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);//找到對(duì)應(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ù)不同而不同,對(duì)于沒(méi)有壓縮的圖像數(shù)據(jù),當(dāng)用1位表示一個(gè)像素顏色。同樣可以使用uglPixelSet屏幕點(diǎn)顯示函數(shù)顯示圖片??梢杂萌∧9ぞ?取出其數(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;
}
通過(guò)這種像素打點(diǎn)的方法,可以顯示任何內(nèi)容的點(diǎn)陣圖片。
4.6 幫助界面,如何顯示字符串
本項(xiàng)目中的圖形控制系統(tǒng)需要制作幫助文檔。通過(guò)讀取固定格式的bin文件,將讀取的字符逐個(gè)畫(huà)在界面上,并且計(jì)算字符的高度和寬度;如果bin文件過(guò)大,可設(shè)計(jì)成多個(gè)屏幕顯示,并通過(guò)輸入鍵盤(pán)切換顯示的幫助頁(yè)面。幫助頁(yè)面效果如圖6所示[9]。
圖7 圖形控制系統(tǒng)幫主頁(yè)面效果圖
cd("/ata0a/");//創(chuàng)建磁盤(pán)格式
UVHandle=open("/ata0a/help.bin",O_CREAT|O_RDWR,0);//打開(kāi)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)目開(kāi)發(fā)實(shí)際,詳細(xì)闡述了圖形界面控制系統(tǒng)中所使用到的設(shè)計(jì)原理,所開(kāi)發(fā)的圖形控制系統(tǒng)已成功運(yùn)用于某型號(hào)艦船的子系統(tǒng)控制中樞,界面美觀,運(yùn)行穩(wěn)定,達(dá)到了預(yù)期設(shè)計(jì)的目的。按照這些設(shè)計(jì)原理,也開(kāi)發(fā)出其他型號(hào)的顯示控制器[10]。 [1]楊娟,王子勇,等.基于WindML的S3C2440顯示驅(qū)動(dòng)設(shè)計(jì)[J].硅谷,2011(9). [2]陳君,唐秀.VxWork下圖形用戶(hù)界面開(kāi)發(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)中文交互界面開(kāi)發(fā)平臺(tái)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009(8). [6]趙漫菲,王光輝.基于嵌入式操作系統(tǒng)VxWorks的多級(jí)界面開(kāi)發(fā)[J].計(jì)算機(jī)工程與設(shè)計(jì),2005(10). [7]陳君,唐秀明.VxWork下圖形用戶(hù)界面開(kāi)發(fā)中雙緩沖技術(shù)應(yīng)用[J].微計(jì)算機(jī)信息,2006(8). [8]何江水,高有行.VxWorks漢字的顯示支持[J].微計(jì)算機(jī)信息,2005(5). [9]孔祥營(yíng),張保山,俞烈彬.VxWorks驅(qū)動(dòng)及分布式編程[M].北京:中國(guó)電力出版社,2007. [10]周祖洋,傅建剛,萬(wàn)洋.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é)語(yǔ)