论述了以Linux作为操作系统的机车显示系统在性能、成本、可靠性等各方面的优势,分析了在构造带图形用户界面(GUI)的嵌入式Linux系统中所用到的关键技术.
0 引言 内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。为了减低不必要的复杂性,内核中不采用kernel module支持,把需要的东西直接编译到内核里;如果使用CompactFlash卡作为存储介质,IDE支持是必不可少的,因为Linux认CompactFlash卡为IDE硬盘;内核对网络的支持可以视用户需求进行添加或删除;至于SCSI、Floppy之类的外设在我们的嵌入式系统中完全没有必要,编译时可去掉。这样,重新编译过的内核显著减小。 linux的一个特性是虚拟内存交换,这一特性使应用程序的内存需求量可以无限制上升,因为操作系统在磁盘中提供了交换空间。而在存储容量相对较小的机车显示系统中,这种特性就用不上了。事实上,在一个要求比较严格的定时系统中,它会导致定时功能的失控。 实现虚拟内存的机制有:地址映射机制、内存分配和回收机制,缓存和刷新机制、请页机制、交换机制、内存共享机制,将实现这些机制的数据结构和函数屏蔽或修改,还要修改与之相关的文件。需要改动的文件主要在/include/linux、/mm、drivers/char、/fs、/ipc/kernel、/init目录下。主要的改动如下:与虚存有关的主要的数据结构是vm_area_struct,将进程的mm_struct结构中的vm_area_struct去掉,vm_area_struct利用了vm_ops来抽象出对虚拟内存的处理方法,屏蔽与虚拟内存操作有关的函数。内存映射主要由do_mmap()实现,改写此函数的代码。取消交换操作,屏蔽用于交换的结构和函数声明,以及实现交换的代码。取消内核守护进程kswapd. 另一种比较简单的办法是将系统的交换空间大小简单地置为0,就可以关掉虚拟内存的分页交换机制了。当程序要求内存大于实际的内存时,系统的表现就如同交换空间溢出时一样,程序不会被加载,或者当要求过多内存时,malloc调用失败 在机车显示系统中,需要用到两类比较重要的设备驱动程序:帧缓冲(frame buffer)驱动程序和闪存MTD驱动程序。 这是最重要的驱动程序之一,因为通过这个驱动程序才能使系统屏幕显示内容。帧缓冲驱动程序通常有三层。最底层是基本控制台驱动程序linux/drivers/char/console.c,它提供了文本控制台常规接口的一部分。通过使用控制台驱动程序函数,我们能将文本打印到屏幕上——但图形或动画还不能(这样做需要使用视频模式功能,通常出现在中间层,也就是linux/drivers/video/fbcon.c中)。这个第二层驱动程序提供了视频模式中绘图的常规接口。 参考文献 [1] 王学龙. <<嵌入式Linux系统设计与应用>>. 清华大学出版社. 2001.8 IBM developerWorks网站. 2002.3
当前,机车网络控制系统发展迅速,系统硬件和软件平台不断更新,信息在网络上的传输及响应愈发快捷,但是机车显示器作为网络系统上极其重要的人机接口设备,其软件平台仍停留在传统的DOS操作系统,显示应用软件采用DOS下的C语言编程,所有任务如数据的传输、显示、设备参数设置等都包含一个循环处理的控制流程中,从而导致数据刷新相对缓慢,开发过程繁琐,难以控制。Linux为我们提供了一个极有吸引力的选择来解决上述问题,首先,他是多任务的操作系统,我们可以采用消息传递机制来实现任务的调度;其次,在linux上有许多专门为嵌入式系统定制的GUI系统,我们可以充分利用它们所提供的图形函数来实现图形化的编程环境,加快应用软件开发进度;另外,linux还有很多优点,如它有完整免费开放的源代码,可针对具体应用修改和优化系统,内核稳定,适用于多种CPU和多种硬件平台,支持网络等,因此用它来构建机车显示系统操作平台是一个不错的解决方案。
1 linux系统平台构建中的关键技术
1.1 系统硬件设计
考虑一般测控系统对嵌入式系统要求比较多的功能有:键盘接口、显示接口、与PC机通信的串行接口、机车网络接网口等。实现的嵌入式系统硬件框图如下:
图2 硬件框图
针对机车显示系统的应用,现在用得比较多的是PC104卡,它采用x86系列的CPU,具有小巧、坚固、扩展性强的特点;另外一种选择是采用以ARM9为核心的高端嵌入式CPU,比如Motorola PowPC系列的MPC823处理器和Intel的Xscale系列处理器等,它们专们为嵌入式产品的开发而设计,具有广泛的外部设备接口,也就是我们常说的片上系统(System on Chip),可用于多种通信显示控制系统,具有更高的性价比。
1.2 系统软件平台设计
由于象Red Hat或Mandrake这样的Linux分发版体积庞大(如果带X-Windows基本都在1G以上),是不可能装在存储容量很小的嵌入式系统上的,因此,需要对linux进行相应的裁减和定制,这其中涉及到的关键技术有:
1) 内核精简及编译
FrameBuffer的优点在于其高度的可移植性、易使用性、稳定性。使用Linux内核的FrameBuffer驱动,可以轻松支持到1024X768X32bpp以上的分辩率。而且目前可得到的绝大多数linux版本所发行的内核中,已经预编译了FrameBuffer支持,通常不需要重新编译内核就可以使用。进入FrameBuffer可以简单地在系统启动时向kernel传送vga=mode-number的参数来激活FrameBuffer设备
闪存MTD驱动程序
MTD 设备是象闪存芯片、小型闪存卡、记忆棒等之类的设备,它们在嵌入式设备中的使用正在不断增长。MTD 驱动程序是在 Linux 下专门为嵌入式环境开发的新的一类驱动程序。相对于常规块设备驱动程序,使用 MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的支持、更好的管理和基于扇区的擦除和读写操作的更好的接口。Linux 下的 MTD 驱动程序接口被划分为两类模块:用户模块和硬件模块。
用户模块:这些模块提供从用户空间直接使用的接口:原始字符访问、原始块访问、FTL(闪存转换层,Flash Transition Layer — 用在闪存上的一种文件系统)和 JFS(即日志文件系统,Journaled File System — 在闪存上直接提供文件系统而不是模拟块设备)。用于闪存的 JFS 的当前版本是 JFFS2(稍后将在本文中描述)。
硬件模块:这些模块提供对内存设备的物理访问,但并不直接使用它们。通过上述的用户模块来访问它们。这些模块提供了在闪存上读、擦除和写操作的实际例程。
为了访问特定的闪存设备并将文件系统置于其上,需要将 MTD 子系统编译到内核中。
(4) 文件系统(filesystem)
系统需要一种以结构化格式存储和检索信息的方法,这就需要文件系统的参与。Ext2fs 是 Linux 事实上的标准文件系统,它已经取代了它的前任——扩展文件系统(Extfs)。因为 Ext2 文件系统的稳定性、可靠性和健壮性,所以几乎在所有基于 Linux 的系统(包括台式机、服务器和工作站——并且甚至一些嵌入式设备)上都使用 Ext2 文件系统。然而,当在机车显示系统中使用 Ext2fs 时,它有一些缺点:
● Ext2 文件系统没有提供对基于扇区的擦除/写操作的良好管理。在 Ext2fs 中,为了在一个扇区中擦除单个字节,必须将整个扇区复制到 RAM,然后擦除,然后重写入。考虑到闪存设备具有有限的擦除寿命(大约能进行 100,000 次擦除),在此之后就不能使用它们,所以这不是一个特别好的方法。
● 在出现电源故障时,Ext2fs 不是防崩溃的。 机车显示系统要求经常性的掉电保护,使用Ext2fs文件系统将造成文件数据的丢失。
● Ext2 文件系统不支持损耗平衡,因此缩短了扇区/闪存的寿命。(损耗平衡确保将地址范围的不同区域轮流用于写和/或擦除操作以延长闪存设备的寿命。)
由于这些原因,通常相对于 Ext2fs,在机车显示系统中使用 MTD/JFFS2 组合是更好的选择。
JFFS2,作为用于微型嵌入式设备的原始闪存芯片的实际文件系统而出现。JFFS2 文件系统是日志结构化的,相对于Ext2文件系统,JFFS2有以下优点:
● JFFS2 在扇区级别上执行闪存擦除/写/读操作要比 Ext2 文件系统好。
● JFFS2 提供了比 Ext2fs 更好的崩溃/掉电安全保护。当需要更改少量数据时,Ext2 文件系统将整个扇区复制到内存(DRAM)中,在内存中合并新数据,并写回整个扇区。这意味着为了更改单个字,必须对整个扇区(64 KB)执行读/擦除/写例程 — 这样做的效率非常低。要是运气差,当正在 DRAM 中合并数据时,发生了电源故障或其它事故,那么将丢失整个数据集合,因为在将数据读入 DRAM 后就擦除了闪存扇区。JFFS2 附加文件而不是重写整个扇区,并且具有崩溃/掉电安全保护这一功能。
● 这可能是最重要的一点:JFFS2 是专门为象闪存芯片那样的嵌入式设备创建的,所以它的整个设计提供了更好的闪存管理。
在linux下,用mkfs.jffs2命令创建JFFS2文件系统。
2 图形用户界面(GUI) -- MiniGUI
从用户的观点来看,图形用户界面(GUI)是系统的一个最至关重要的方面:用户通过 GUI 与系统进行交互。所以 GUI 应该易于使用并且非常可靠。但它还需要是有内存意识的,以便在我们的内存受限的显示系统上可以无缝执行。所以,它应该是轻量级的,并且能够快速装入。另一个要考虑的重要方面涉及许可证问题。一些 GUI 分发版具有允许免费使用的许可证,甚至在一些商业产品中也是如此。另一些许可证要求如果想将 GUI 合并入项目中则要支付版税。
现在面向嵌入式Linux 系统的图形用户界面很多,如MicoroWindows/NanoX ,OpenGUI,Qt/Embedded,MiniGUI等,我们选用MiniGUI ,到目前为止,已经非常成熟和稳定。从MiniGUI的官方网站(http://www.minigui.org)上可以下载MiniGUI的源代码,
因为MiniGUI 是以源代码的形式发布的,在硬盘上以编译的方法产生的MiniGUI的libminigui 目录下包含了这些源代码以及编译时生成的中间文件,所以需要的空间很大,是不可能将它全部拷贝到容量受限的嵌入式系统上的,我们需要的文件有:
● MiniGUI 的函数库,包括 libminigui、libmywins 和 libmgext 等,还包括其他的应用程序函数库。
● MiniGUI 的配置文件,即 /usr/local/etc/MiniGUI.cfg 文件。
● MiniGUI 所使用的资源文件。在 PC 上安装之后,MiniGUI 的资源文件保存在usr/local/lib/minigui/res 目录下。
如果还是觉得太大,参照下面的方法进行修改:
1. 首先可以修改编译选项,把不用的功能去掉,比如说繁体支持等。这样库会小一些。
2. 去掉无用的资源,默认安装的资源在/usr/local/lib/MiniGUI下面。其中FONTS目录可以只保留一种字体,IMETAB下面可以只保留一种输入法,RES下面也可以删除一些位图文件,调整MiniGUI 的配置文件内容。
在拥有图形用户界面的机车显示系统Linux操作平台已经搭建完成后,就可以在开发系统上写自己的应用程序,然后将它烧录至闪存设备上运行。
3 结束语
目前,该操作系统平台已经在株洲电力机车研究所研制成功,硬件平台采用PC104卡,存储介质为CompactFlash卡,经测试,数据刷新及显示满足一般的实时性要求。