基于linux的机车显示系统平台的设计

发表于:2007-07-04来源:作者:点击数: 标签:
论述了以 Linux 作为操作系统的机车显示系统在 性能 、成本、 可靠性 等各方面的优势,分析了在构造带图形用户界面 (GUI) 的 嵌入式 Linux 系统中所用到的关键技术 . 0 引言 当前,机车 网络 控制系统发展迅速,系统硬件和软件平台不断更新,信息在 网络 上

论述了以Linux作为操作系统的机车显示系统在性能、成本、可靠性等各方面的优势,分析了在构造带图形用户界面(GUI)嵌入式Linux系统中所用到的关键技术.

0 引言
当前,机车网络控制系统发展迅速,系统硬件和软件平台不断更新,信息在网络上的传输及响应愈发快捷,但是机车显示器作为网络系统上极其重要的人机接口设备,其软件平台仍停留在传统的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 HatMandrake这样的Linux分发版体积庞大(如果带X-Windows基本都在1G以上),是不可能装在存储容量很小的嵌入式系统上的,因此,需要对linux进行相应的裁减和定制,这其中涉及到的关键技术有:
1) 内核精简及编译

内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。为了减低不必要的复杂性,内核中不采用kernel module支持,把需要的东西直接编译到内核里;如果使用CompactFlash卡作为存储介质,IDE支持是必不可少的,因为LinuxCompactFlash卡为IDE硬盘;内核对网络的支持可以视用户需求进行添加或删除;至于SCSIFloppy之类的外设在我们的嵌入式系统中完全没有必要,编译时可去掉。这样,重新编译过的内核显著减小。

2)虚拟内存机制的屏蔽

linux的一个特性是虚拟内存交换,这一特性使应用程序的内存需求量可以无限制上升,因为操作系统在磁盘中提供了交换空间。而在存储容量相对较小的机车显示系统中,这种特性就用不上了。事实上,在一个要求比较严格的定时系统中,它会导致定时功能的失控。

实现虚拟内存的机制有:地址映射机制、内存分配和回收机制,缓存和刷新机制、请页机制、交换机制、内存共享机制,将实现这些机制的数据结构和函数屏蔽或修改,还要修改与之相关的文件。需要改动的文件主要在/include/linux/mmdrivers/char/fs/ipc/kernel/init目录下。主要的改动如下:与虚存有关的主要的数据结构是vm_area_struct,将进程的mm_struct结构中的vm_area_struct去掉,vm_area_struct利用了vm_ops来抽象出对虚拟内存的处理方法,屏蔽与虚拟内存操作有关的函数。内存映射主要由do_mmap()实现,改写此函数的代码。取消交换操作,屏蔽用于交换的结构和函数声明,以及实现交换的代码。取消内核守护进程kswapd.

另一种比较简单的办法是将系统的交换空间大小简单地置为0,就可以关掉虚拟内存的分页交换机制了。当程序要求内存大于实际的内存时,系统的表现就如同交换空间溢出时一样,程序不会被加载,或者当要求过多内存时,malloc调用失败

3) 设备驱动程序

在机车显示系统中,需要用到两类比较重要的设备驱动程序:帧缓冲(frame buffer)驱动程序和闪存MTD驱动程序。

帧缓冲(FrameBuffer)驱动程序

这是最重要的驱动程序之一,因为通过这个驱动程序才能使系统屏幕显示内容。帧缓冲驱动程序通常有三层。最底层是基本控制台驱动程序linux/drivers/char/console.c,它提供了文本控制台常规接口的一部分。通过使用控制台驱动程序函数,我们能将文本打印到屏幕上——但图形或动画还不能(这样做需要使用视频模式功能,通常出现在中间层,也就是linux/drivers/video/fbcon.c中)。这个第二层驱动程序提供了视频模式中绘图的常规接口。

帧缓冲区是显卡上的内存,需要将它内存映射到用户空间以便可以将图形和文本写到这个内存段上,然后这个信息将反映到屏幕上。帧缓冲区支持提高了绘图的速度和整体性能。这也是顶层驱动程序引人注意之处:顶层是非常特定于硬件的驱动程序,它需要支持显卡不同的硬件方面——象启用/禁用显卡控制器、深度和模式的支持以及调色板等。所有这三层都相互依赖以实现正确的视频功能。与帧缓冲区有关的设备是/dev/fb0(主设备号 29,次设备号 0)。
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卡,经测试,数据刷新及显示满足一般的实时性要求。

参考文献

[1] 王学龙. <<嵌入式Linux系统设计与应用>>. 清华大学出版社. 2001.8

[2] Anand K Santhanam、Vishal Kulkarni。嵌入式设备上的 Linux 系统开发。

IBM developerWorks网站. 2002.3

原文转自:http://www.ltesting.net