Linux采用虚拟显存技术,系统中的所有进程之间以虚拟形式共享显存。对每位进程来说,它们似乎都可以访问整个系统的所有数学显存。更重要的是,虽然单独一个进程,它拥有的地址空间也可以远远小于系统数学显存。在地址空间中,进程有权访问虚拟显存地址区间(例如08048000~0804c000)。那些可被访问的合法地址区间称作显存区域(memoryarea)。通过内核,进程可以给自己的地址空间动态地添加或减轻显存区域,而进程只能访问有效范围内的显存地址。每位显存区域也具有相应进程必须遵守的特定访问属性,如只读、只写、可执行等属性。假如一个进程访问了不在有效范围中的地址,或以不正确的形式访问了有效地址,这么,内核将会中止该进程,并返回“段错误”信息。
在应用程序中,通常将FrameBuffer设备映射到进程地址空间,例如下边的程序就可打开/dev/ib0设备,并通过mmap系统调用来进行地址映射,随即用memset将屏幕清空。Structfb_var_screen-info记录了帧缓冲设备和指定显示模式的可更改信息,包括显示屏幕的帧率、每个象素的比特数和一些时序变量。实现以上过程的函数代码如下:
据悉,FrameBuffer设备还提供了若干ioctl命令,通过这种命令可以获得显示设备的一些固定信息(例如显示显存大小)以及与显示模式相关的可变信息(例如码率、象素结构、扫描线的字节长度),同时可获得伪彩色模式下的调色板信息等。
3GUI系统的自主开发
嵌入式GUI的总体设计思想是把所有操作都由对象和消息驱动,通过对现有GUI的剖析来对多种嵌入式应用系统按照GUI的要求进行总结,之后具象出各类组件类。嵌入式GUI的所有组件和数据都被设计成对象,组件对象通过消息来通讯。嵌入式GUI在消息驱动下可产生整体并构成系统。其整体框架和体系结构如图2所示。
系统中的所有消息节点将构成空闲队列和消息队列,其中消息队列储存当前EGUI系统中没有处理的消息。消息队列由消息管理器进行操作和管理。图2中的输入设备具象层、操作系统具象层和组件对象集合都是消息发生器,它们就会形成EGUI消息。调用消息管理器的操作可将生成的消息装入到消息队列中。消息管理器用于管理消息队列和空闲队列,当有消息形成时,消息管理器将执行消息入队PUSH()操作,其处理过程是先从空闲队列中摘下一个节点,产生一个消息节点,再将它挂到消息队列的队尾。桌面对象管理器负责分发消息,它可通过调用消息管理器的出队操作POP()来取得待处理的消息,处理过程是将消息队列的第一个消息节点摘下,并取得该消息节点的信息,之后将该消息节点挂到空闲队列的队尾。桌面对象管理器取得消息后嵌入式linux系统,将根据一定的策略对取得的消息进行分发,并让接收该消息的组件对象中的消息处理函数来处理该消息。分发消息时如何安装LINUX,如果消息指定了接收对象,则将消息路由到接收对象;而非按键的系统消息。将被路由到桌面对象管理器的第一个子对象;对于用户定义的消息,系统会将其路由到指定的对象。而组件对象处理消息时,假若处理操作要改变屏幕数据,组件对象将调用绘图操作Draw重画自己的外型。整个系统就是这样不断地形成消息、分发消息、处理消息linux 命令,因而产生一个无限循环,同时驱动EGUI运行。
4结束语
针对当前嵌入式GUI的特征,本文给出了可支持汉字显示、键盘输入的多线程嵌入式GUI系统的设计方式。该方式设计的系统采用窗口模式,并且易于操作嵌入式linux系统,同时具有可视化界面、操作灵活、资源占用少等优点,并可支持JPG格式的图象文件。