1. QNX 实时操作系统介绍
QNX 实时操作系统(QNX Real Time Operating System)是由位于加拿大渥太华的QNX软件系统公司开发的一个针对嵌入式应用的微内核操作系统。QNX软件系统公司成立于1981年,在过去的20多年中一直致力于微内核实时操作系统的研究与开发。目前的QNX 实时操作系统已经发展成一个可以使用在严实时应用中的高可靠性实时操作系统,能够运行在x86/Pentium, PowerPC, ARM, StrongARM, XScale, MIPS, SH-4等一系列硬件平台上,是在关键任务应用中首选的两个实时操作系统之一(另外一个是VxWorks)。
QNX 是一个与电气工程师协会(Institute of Electrical and Electronics Engineers,IEEE)发表的便携式操作系统界面标准(Portable Operating System Interface, POSIX) 相兼容的实时操作系统。该操作系统提供了一系列可裁剪的功能全面的高可靠性高性能组件,包括分布式计算,资源管理,网络应用,图形窗口系统,文件系统,以及对Java的支持等等。此外,QNX还是一个与Linux高度兼容的操作系统,由于gcc和gmake等Linux 平台上常用的应用程序开发工具已经被移植到QNX 平台上,很多为Linux平台编写的应用程序可以直接拿到QNX平台上编译运行。此外,QNX还提供了一个类似于Visual C++的应用程序集成开发环境,称为Photon Applicatioin Buider (PhAB)。在这个集成开发环境里程序开发人员能够很方便的开发和调试基于图形用户界面的QNX 应用程序。
更为重要的是,对于应用程序开发人员来说,QNX是一个完全免费的实时操作系统。根据QNX软件系统公司发布的使用授权协议,在一个产品商业化之前应用程序开发人员可以自由的使用QNX实时操作系统而无须向QNX 公司交付任何软件使用费用。同样,QNX的应用程序集成开发环境PHAB对于软件开发人员来说也是免费的。QNX 实时操作系统以及QNX应用程序集成开发环境均可以从QNX公司的主页(http://www.qnx.com/)下载,目前可以下载到的版本是6.2.1。将下载得到的映象文件的内容刻录到一张光盘上,然后利用该光盘启动计算机即可开始安装QNX 操作系统。总的来说安装的过程相当的简单,只需要选择启动方式以及指定QNX 文件系统所在的位置即可。系统文件拷贝完成后将自动的重新启动机器,然后需要用root登录进入系统并且自动安装其它应用程序。在一台500 MHz + 128 MB的计算机上,安装过程通常都小于15分钟。插图一展示了一个正在运行的QNX操作系统。
插图一、 QNX操作系统
2. QNX对Java语言的支持
目前支持QNX操作系统的Java虚拟机有两个,一个是IBM公司开发的J9虚拟机,另外一个是Aonix公司开发的PERC虚拟机。J9和PERC都是专门为实时的嵌入是应用开发的虚拟机,在其设计中对速度优化,内存管理,线程管理,本地方法,垃圾回收,及时编译,可移植性以及可裁剪性能方面做了很大的努力。在6.2之后版本的QNX操作系统中缺省地提供了J9虚拟机的基本配置,只是没有将其放入系统路径中。我们只需要对系统进行一些简单的配置即可以开始在QNX操作系统上开发简单的Java应用程序。
在QNX 6.2.1上J9虚拟机被缺省安装在/usr/qde/eclipse/jre这个目录里(在QNX 6.2上是/usr/eclipse/ive目录),我们将这个目录定义为J9_HOME,相当于我们在PC上的JAVA_HOME。在这个目录里包含了J9虚拟机及其编译器的可执行文件,我们需要将其包括在环境变量PATH中。在$J9_HOME/bin目录下包含了一些运行J9虚拟机及其编译器所必需的一些动态连接库,因此需要将这个目录包含在环境变量LD_LIBRARY_PATH中。为方便起见,我们将这些配置写到用户根目录下的.profile文件中:
export J9_HOME=/usr/qde/eclipse/jre
# QNX 6.2
# export J9_HOME=/usr/eclipse/ive
export PATH=$PATH:$J9_HOME/bin:.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$J9_HOME/bin
在QNX的缺省安装中仅仅包含了J9虚拟机以及编译器的最基本组件,不包括对图形用户界面的支持。在嵌入式Java应用程序中,通常采用AWT或者是SWT来构建图形用户界面。J9虚拟机的AWT支持包含在WebSphere用户环境升级包(WebSphere Custom Environment Update)中,QNX专业版用户可以直接从QNX公司的网站下载,其他用户可以从IBM公司的WebSphere网站(http://www.ibm.com/embedded/)下载。将从WebSphere网站下载到的ZIP文件解压缩后,在features/com.ibm.ive.personalConfig_5.5.0目录中有一个wsdd5.0.jar的文件。将该文件解压缩,在wsdd5.0\local\ive\runtimes\qnx\common\ive\lib\jclMax目录下有一个prsnlqnx.jar的文件,这就是J9虚拟机所需要的AWT类库,将其拷贝到你的$J9_HOME/lib目录下。在wsdd5.0\local\ive\runtimes\qnx\x86\ive\bin目录下还有一个libswt-photon-2130.so文件,是支持AWT所必需的动态连接库,将其拷贝到你的$J9_HOME/bin目录下。最后,修改用户根目录下的.profile文件,将prsnlqnx.jar加入到环境变量CLASSPATH中:
export CLASSPATH=$CLASSPATH:$J9_HOME/lib/prsnlqnx.jar:.
到此为止我们已经成功的配置了最基本的Java应用程序开发工具。与PC平台上的Java SDK相类似,J9虚拟机也提供了编译和运行Java应用程序的相应命令: j9c命令用来编译Java源代码,j9命令启动J9虚拟机运行命令行中指定的Java应用程序。坚持要使用javac/java命令的开发人员,可以自行创建指向j9c/j9命令的符号链接(ln -s)或者是别名(alias)。
下面我们编译运行一个简单的AWT图形界面以确认我们已经正确的安装配置了Java开发环境。将下面的代码保存为HelloAwt.java,使用下面的命令编译运行该程序:
j9c –classpath $CLASSPATH HelloAwt.java
j9 HelloAwt
插图二是HelloAwt应用程序在QNX平台上运行的屏幕截图。
import java.awt.*;
import java.awt.event.*;
public class HelloAwt extends Frame
{
public HelloAwt()
{
Label label = new Label("Hello AWT!");
add(label);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
HelloAwt hello = new HelloAwt();
hello.setTitle("I Love Java!");
hello.setSize(200, 200);
hello.setVisible(true);
}
}
插图二、运行在QNX操作系统上的HelloAwt程序
3. Eclipse集成开发环境
习惯于使用集成开发环境进行开发的工程师可能会急着问:有没有能够在QNX平台上开发Java应用程序的集成开发环境呢?答案是肯定的:确实存在基于QNX平台的Java集成开发环境,它就是著名的Eclipse项目。
Eclipse组织是由Borland、IBM、Red Hat、SuSE、QNX等公司于2001年11月创建的。该组织的目的是为开发人员提供一个开放并且免费的平台,在该平台上可以利用多种程序设计语言为不同的操作系统和硬件平台开放应用程序。通过一个开放的插件框架,开发人员可以自由的创造、集成和使用各种各样的软件开发工具,从而有效的提高软件开发的效率。目前Eclipse集成开发环境已经可以在AIX、HP UNIX、Linux、Mac OS X、QNX、Solaris和Windows等多个平台上运行。
为了在QNX平台上使用Eclipse,我们需要从Eclipse的网站下载Eclipse平台和针对J9虚拟机的启动插件。在Eclipse的网站上列出了多个提供下在服务的镜像站点,你可以选择其中的任意一个开始下载。进入某个下载站点后你可能会发现有多个版本的Eclipse可供选择,我们推荐的版本是发行版本2.1(R-2.1-200303272130),进入对应的目录后下载Eclipse平台eclipse-platform-2.1-qnx-photon.zip。在该目录下还有一个名为j9_read_me.html的文件,根据该文件中的说明并进入相应下载页面下载针对J9虚拟机的启动插件org.eclipse.jdt.launching.j9_20030213.zip。将Eclipse平台解压缩至/usr/qde/eclipse目录(即$J9_HOME的上一级目录)下,将启动插件解压缩至/usr/qde/eclipse/plugins目录下。在/usr/qde/eclipse/plugins/org.eclipse.swt.photon_2.1.0/os/qnx/x86目录下有一个名为libswt-photon-2133.so的文件,是启动SWT图形界面所必需的动态连接库。由于Eclipse平台是基于SWT的,因此在启动Eclipse平台之前需要将该文件所在的路径加入环境变量LD_LIBRARY_PATH之中。为了简单起见,我们干脆把这个文件拷贝到$J9_HOME/bin目录,因为在前面的配置中我们已经将这个目录添加到环境变量LD_LIBRARY_PATH里面了。
启动Eclipse集成开发环境的命令是/usr/qde/eclipse目录中的eclipse脚本。在终端模拟器中运行该命令,如果看到如图三所示的界面,就表示Eclipse已经正确的安装和配置好了。如果在运行中出现任何错误信息,可以参考/usr/qde/eclipse/workspace/.metadata目录中的.log文件中的记录排除错误。
插图三、运行在QNX操作系统上的Eclipse集成开发环境
为方便起见,可以修改用户配置文件./profile将/usr/qde/eclipse目录添加到系统环境变量PATH中,这样每次启动Eclipse的时候就不用输入前面的目录名了。
export PATH=$PATH:/usr/qde/eclipse
需要进一步学习如何使用Eclipse集成开发环境的读者,可以自行参考Eclipse网站上所提供的文档和教程。
4. 基于SWT的图形用户界面
使用Java语言开发过图形用户界面的工程师都知道,基于Java的图形用户界面的运行速度是相当慢的。在配置不高的低端系统上,即使是简单的键盘输入或者是鼠标点击动作也会让应用程序陷入停顿。虽然基于AWT的图形用户界面在执行效率上要优于基于Swing的图形用户界面,但是仍然与基于C/C++或者其他高级程序设计语言的图形用户界面存在较大的差距。使用过Eclipse的读者可能会发现,Eclipse运行起来不象我们所常见的Java应用程序那样慢,这是因为Eclipse使用了SWT来构建图形用户界面。SWT直接调用了操作系统的图形库,从而使得Java应用程序的Look & Feel 与操作系统的习惯完全一致;更为重要的是,对本地方法的直接调用大幅度的提高了基于SWT 的Java应用程序的运行速度。
最早的时候SWT是作为Eclipse平台的一部分出现的,只有基于Eclipse平台的应用程序才能够使用SWT。SWT逐步走向成熟之后被设计成一个独立的Java类库,这使得那些习惯于使用其他开发环境(例如命令行)的工程师也能够在其应用程序中使用SWT。如果你已经按照本文中第三节的说明安装配置了Eclipse集成开发环境,你只需要将/usr/qde/eclipse/plugins/ org.eclipse.swt.photon_2.1.0/ws/photon目录下的swt.jar加入到系统环境变量CLASSPATH中即可开始使用SWT。如果你没有安装Eclipse集成开发环境,但是仍然希望在QNX上使用SWT来构建图形用户界面,你可以从Eclipse网站或者任意镜像站点下载发行版本2.1的SWT类库swt-2.1-qnx-photon.zip。将下载到的ZIP文件解压缩,把文件swt.jar添加到系统环境变量CLASSPATH中,将文件libswt-photon-2133.so所在的目录添加到系统环境变量LD_LIBRARY_PATH中。
通常来说,构建一个基于SWT 的图形用户界面需要经过如下步骤:
(1) 创建一个Display对象,该对象代表一个SWT 进程(session)。
(2) 创建一个或者是多个Shell对象,一个Shell对象相当于我们在AWT/Sing里面所说的顶极容器,也就是应用程序的主窗口。
(3) 在Shell对象上面创建用户所需要的控件。
(4) 初始化所有的控件,包括大小和初始值等,为控件的事件注册必要的监听器Listener。
(5) 打开主窗口。
(6) 启动事件处理循环,一直到用户结束程序的运行。
(7) 垃圾回收。
下面我们编译运行一个简单的SWT图形界面以确认我们已经正确的安装配置了SWT类库和动态连接库。将下面的代码保存为HelloSwt.java,使用下面的命令编译运行该程序:
j9c –classpath $CLASSPATH HelloSwt.java
j9 HelloSwt
插图四是HelloSwt应用程序在QNX平台上运行的屏幕截图。
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
public class HelloSwt
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.CENTER);
label.setText("Hello SWT!");
label.setBounds(shell.getClientArea());
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}
插图四、运行在QNX操作系统上的HelloSwt程序
需要进一步学习如何使用SWT来构建图形用户界面的读者,可以自行参考Eclipse网站上所提供的文档和教程。
5. 小结
本文简单地介绍了QNX实时操作系统以及在QNX操作系统上开发Java应用程序所需要的配置和工具。作为一个优秀的实时操作系统,QNX对Java语言的支持丝毫不逊色于我们常用的Windows或者Linux平台。功能强大的Eclipse集成开发环境使得开发人员摆脱了传统的“主机/目标机”开发模式,能够游刃有余的在QNX平台上直接开发调试Java应用程序。对AWT和SWT的支持,使得两个战营的开发人员都能够在一个平台上开发出漂亮美观的图形用户界面。因此,QNX是一个开发嵌入式Java产品的绝妙平台,在基于PC-104构架的嵌入式系统中有着广阔的应用前景。
读者如果需要进一步了解本文中提及的QNX实时操作系统、IBM WebSphere软件、Eclipse集成开发环境或者是Java编程语言,请自行参考如下网站所提供的文档和教程。
QNX公司: http://www.qnx.com/
IBM WebSphere: http://www.ibm.com/embedded/
Eclipse网站: http://www.eclipse.org/
Java主页: http://java.sun.com/