1引言
实时操作系统VxWorks凭借良好的可靠性和卓越的实时性被广泛的应用在通信、军事、航空和航天等高精尖技术及实时性要求极高的领域中。随着嵌入式系统的发展,很多领域的嵌入式应用(如导航显控系统、接收器终端、多媒体终端、监控系统等)的人机交互界面也对图形用户界面的需求不断提高。良好的人机交互界面不但要美观易懂而且要操作简单,从而提高用户的使用效率。与一般系统的图形用户界面相比较,嵌入式系统下的图形用户界面要求体积小、占用资源少、高性能、高可靠性、可配置等特点。本文根据嵌入式系统的特点,利用VxWorks提供的图形开发组件WindML完成对导航系统的人机交互界面的开发。
2 VxWorks概述
VxWorks操作系统是美国风河系统(Wind River System)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),良好的持续发展能力、高性能的内核以及友好的用户开发环境,使其在嵌入式实时操作系统领域逐渐占据一席之地。VxWorks是一个具有可伸缩、可裁减和高可靠性,同时适用于所有流行目标CPU平台的实时操作系统。
3 WindML概述
WindML(Wind Media Library)是基于实时嵌入式操作系统VxWorks的多媒体应用的支持链接库,WindML提供了对运行在嵌入式系统上的多媒体应用程序的支持,它提供了独立于多种操作系统的基本图形、视频和音频技术,以及用来开发可定制的标准化设备驱动程序的框架。并且,WindML提供了一系列工具用来处理输入设备和输入设备事件。以上这些功能绝大部分都由WindML提供的API来完成。WindML由两部分组成:软件开发工具箱(SDK)和硬件开发工具箱(DDK)。SDK与DDK的相互关系与结构如图1所示。

图1 SDK与DDK的相互关系与结构
4导航系统中人机交互界面的开发
4.1导航系统概述
我们所开发的这个系统目标是使操作员通过控制面板上的键盘进行操作,并在屏幕上实时显示导航系统的工作参数。
本系统是一个建立在实时操作系统VxWorks下的复杂的嵌入式应用,可以划分为板级支持包(BSP)软件、内核(Wind Kernel)和应用程序三部分。它的硬件平台是:盛博的PC/104中央处理模块、16M电子盘、320*240EL彩色显示屏、标准键盘、一个232接口等。
本系统的应用程序主要分为三个模块:接口模块、计算模块、人机交互模块,如图2所示:

图2 嵌入式车载导航系统应用程序功能模块
(1) 接口模块:该模块主要处理与外部设备(提供位置信息的GPS,提供速度信息的加速度计等)相关的通讯。该模块需要根据不同设备的协议,定制相应的通讯程序,保证所有的数据接收、发送无误且不丢失。
(2) 计算模块:该模块主要是与导航定位及数据处理相关的计算。
(3) 人机交互模块:该模块实现所有的人机交互功能,显示与行驶有关的东向、北向、高程、速度、距离、时间等信息以及工作模式的选择等。
在软件设计中,必须保证系统的实时性,准确接收导航设备的各种信息,因此,在设计中,与外部设备进行通讯的接口模块的优先级最高;计算模块的程序必须实时响应,其优先级次之;人机交互模块包含大量的图形显示,其优先级最低。每个模块对应操作系统的一个任务。
4.2 导航系统中人机交互界面的设计与实现
4.2.1 导航系统中人机交互界面的设计
为了使导航系统中人机交互界面的操作简洁、方便,采用热键(F1、F2、PAGEUP、ENTER等)菜单的方式,并将显示屏幕划分为三个功能区:屏幕上部的I区为基本信息栏,显示导航模式、时间信息以及提供给操作人员的帮助、错误、警告信息等;屏幕中部的II区为主显示区,内容为东向、北向、高程、速度、距离等信息;屏幕下部的III区为系统命令操作显示栏,显示每个状态下可执行的操作命令菜单,系统进入导航状态后的画面如图3所示。

图3 导航系统的显示界面
根据画面上操作命令菜单的提示,按下相应的热键,进入不同的界面,进行各种需要的命令操作。
4.2.2 人机交互界面的具体实现
本导航系统人机交互界面显示二维图形,使用WindML进行开发。系统收到应答的数据后,在显示屏幕上,以图表或动态的界面显示,供用户观察。在WindML组件中,所有图像、文字、窗口等都是以像素的形式画到显示设备上的。
WindML在使用前必须进行配置和编译。配置用来选择WindML编程中支持的硬件和字体。配置有两种方式,一种是通过菜单项tornado>tools>WindML下的配置工具中来设置,另一种是直接用命令行方式编辑头文件和源文件。没有特殊要求的情况下,都是用配置工具进行配置的。在配置工具中选择好相应硬件的类型后,按配置工具上的编译按钮就可以编译了,编译成功后就可以在VxWorks的开发环境Tornado中进行编程了。VxWorks支持C和C++,在WindML的编程中,用C和C++写的程序完全可以编译通过,但是C语言中的printf()等函数是无法输出字符的,必须用WindML提供的相应函数才行。
WindML可以使用多线程和多任务,但图形的资源是一定的,为防止多线程之间产生资源冲突,需要使用互斥信号量锁定资源。在WindML中,一般在使用一组画图函数前,用uglBatchStart(gc)通过互斥信号量锁定图形上下文、图形设备及缓冲,并且隐藏光标。在画图操作完成后,再用uglBatchEnd(gc)释放被锁定资源以被其它的画图函数所使用[4]。下面是一个基本的画图操作程序:
#include〈ugl/ugl.h〉 /*包含头文件*/
…
UGL_LOCAL struct _colorStruct /*定义RGB值,确定一个配色表*/
{ UGL_ARGB rgbColor;
UGL_COLOR uglColor;}
colorTable[] ={ { UGL_MAKE_ARGB(0xff, 0, 0, 0), 0}, …
{ UGL_MAKE_RGB(255, 255, 255), 0} };
#define BLACK (0) /*对配色表中每一颜色定义名称*/
…
#define WHITE (15)
void BasicExample(void) /*程序入口*/
{
UGL_GC_ID gc; /*定义图形上下文gc*/
uglINItialize(); /*初始化*/
gc = uglGcCreate(devId); /*创建图形上下文*/
uglColorAlloc(devId,&colorTable[BLACK].rgbColor,UGL_NULL,&colorTable[BLACK].uglColor, 1);
… /*色彩初始化,允许已被定义过的颜色被使用*/
uglColorAlloc(devId,&colorTable[WHITE].rgbColor,UGL_NULL,&colorTable[WHITE].uglColor, 1);
uglBatchStart(gc); /*锁定图形资源*/
uglForegroundColorSet(gc,colorTable[WHITE].uglColor); /*设定前景色*/
uglBackgroundColorSet(gc,colorTable[GREEN].uglColor); /*设定背景色*/
uglLineWidthSet(gc,2); /*设定线宽*/
uglRectangle(gc,0,0,320,240); /*画矩型*/
uglBatchEnd(gc);
…
}
在本系统的人机交互界面中,需要显示实时时钟,而WindML提供了符合POSIX 1003.1b标准的API以提供系统时钟,下面是显示系统开机以来的时间的程序:
void DisplaySystemTime(UGL_GC_ID gc)
{
struct timespec NewSystemTime;/*定义结构*/
time_t OldSystemTime;
clock_gettime(CLOCK_REALTIME,&NewSystemTime);/*获取系统时间*/
if(NewSystemTime.tv_sec!=OldSystemTime)/*如果系统时间有更新*/
{
int TempTime,j;
char buffer[20];
TempTime=int(NewSystemTime.tv_sec/(60*60));/*小时数*/
if(TempTime<10)
{j=sprintf(buffer,"%d",0);/*小时数小于10时,首位补0*/
j+=sprintf(buffer+j,"%d",TempTime); /*写入小时数*/
}
else { j=sprintf(buffer,"%d",TempTime); } /*写入小时数*/
j+=sprintf(buffer+j,"%c",':'); /*写入时钟分割符号“:”*/
TempTime=int((NewSystemTime.tv_sec-TempTime*(60*60))/60); /*分钟数*/
uglBatchStart(gc); /*锁定图形资源*/
uglTextDraw(gc,200,4,-1,buffer); /*显示时间*/
uglBatchEnd(gc); /*释放图形资源*/
OldSystemTime=NewSystemTime.tv_sec;
}
}
5 结论
根据现代导航系统提出的多功能、实时性好等要求,本文基于实时操作系统VxWorks,设计了导航系统中的应用软件系统,实现了通讯、导航计算和人机交互几个主要任务,满足了现代导航操作方便、安全可靠的要求。




