基于Linux FrameBuffer的嵌入式GUI设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于Linux FrameBuffer的嵌入式GUI设计与实现[摘要] 在嵌入式系统中,为了在较小用户存储空间内实现GUI,本文在讨论
GUI总体框架的基础上,引入Linux FrameBuffer机制,重点讨论了如何接收转换用
户消息以及GUI响应用户请求的设计与实现问题,为设计轻量级GUI提供了有效途径。

[关键词] 嵌入式FrameBuffer GUI
[Abstract] In embedded systems, in order to achieve smaller user storage space GUI, GUI, this paper discussed the general framework, based on the introduction of Linux FrameBuffer mechanism, focusing on how to convert users to receive messages and respond to user requests for GUI design and implementation issues , lightweight design provides an effective means of GUI.
[Key Words] Embedded FrameBuffer Graphical User Interface
1引言
随着嵌入式Linux系统广泛应用于各类电子产品,越来越多的产品都需要提供人机交互功能。

因此,设计高效简洁的图形用户界面(Graphical User Interface, GUI)在嵌入式产品中的需求将越来越突出。

目前,大部分Linux商业GUI因编译库过大而不能用于轻量级Flash系统。

Linux帧缓冲(FrameBuffer)的出现为用户开发设计轻型GUI提供了有效途径。

帧缓冲作为内核当中的一种基础图形设施驱动程序接口,它将显示设备的显存抽象为帧缓冲区,为用户提供了一种设备无关操作图像输出的软接口。

这种操作不需要内核态的中断调用来直接写屏,只需在用户态将显存映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。

论文基于这一原理,重点讨论了用户消息处理、消息响应以及GUI模块的设计与实现问题。

2GUI总体框架
GUI的总体结构如图1所示。

图1GUI总框架图
此系统分为用户消息处理、用户消息响应和GUI响应三个大模块。

用户消息处理模块监听用户输入;消息响应模块处理用户请求,并把用户请求插入到GUI 消息队列;GUI模块处理相应的用户请求并把结果输出到FrameBuffer。

用户消息处理模块和用户消息响应分别使用一个进程作数据监听处理,进程间通信使用socketpair实现,GUI处理单独使用一个进程处理图像之间的显示和隐藏。

整个系统按照分层、分块设计,以提高GUI系统的可配置性和可移植性,在上下层之间使用消息队列进行消息传递和处理。

整个系统按照并行系统的原则处理消息数据,
以实现GUI的基本功能。

3用户消息处理模块的设计与实现
用户消息处理模块主要实现监听用户输入设备,把用户输入转换成字符消息,并把字符消息传输到消息响应模块。

在Linux中,Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面,所有的I/O设备都被映射到/dev/input 之下,在用户层可以直接读写相关的设备文件,以实现获取用户输入和用户输入消息模拟。

在处理触摸屏输入的时候通过input系统把相关的模拟消息写入键盘设备文件。

用户消息接收主要通过select复用监听相关的设备文件描述符。

用户消息处理模块实现如下:
int userinput_get(cont char *input_dev, char *iput_key)
{
……
input_fd = open(input_dev, O_RDWR));
while (1)
{
……
ret = select(input_dev +1, &readfds, NULL, NULL, &time_out);
if(FD_ISSET(input_dev))
{
len = read(input_dev, buff,sizeof(buff));
{
handle_input(buff, iput_key); //处理用户数据成KEY_类型字符;
}
}
}
……
}
4用户消息响应模块的设计与实现
在用户消息响应模块中主要实现获取用户消息,并且把用户消息投递到GUI 相关的控件。

用户消息处理模块设计和用户消息响应模块处于不同的进程,进程间通信使用socketpair,此模块在获取到消息处理模块传输的消息后把输入请求放到一个消息队列中以供GUI模块使用。

此模块在整个系统中属于一个薄粘合层,用以实现输入模块和GUI模块之间的分离。

此模块框架实现如下:
int usermsg_put()
{
inputmsg_queue = msgget(IPC_PRIV ATE, IPC_CREAT);
while (1)
{
……
ret = select(socket[1] +1, &readfds, NULL, NULL, &time_out);
if(FD_ISSET(socket[1]))
{
len = read(socket[1], buff,sizeof(buff));
{
msgsnd(inputmsg_queue, buff, sizeof(DVSMSG), IPC_NOWAIT);
}
}
}
……
5GUI模块
GUI模块处理用户输入,根据请求消息通过写FrameBuffer把不同控件显示或隐藏在显示设备之上。

GUI进程通过读取消息队列,根据编程把响应事件投递到当前每一个控件。

在设计GUI控件时,各类控件采取了宽松设计,每一种控件上下文包含了从显示到结束显示的每个环节。

空间包括了常规窗口、输入、按钮等,其中常规窗体结构实现如下:
typedef struct normal_window {
intx;
inty;
intw;
inth;
int (*init)(void);
int (*effect)(void);
int (*clean away)(void);
}N_WINDOW;
6结语
经过测试,在编译Linux内核时加入FrameBuffer支持后,利用写FrameBuffer 机制实现的GUI库存在空间小,能够较好满足Flash空间较小的用户的需求,为实现轻量级GUI的嵌入式产品提供了新方法。

参考文献:
[1] 李新,何华灿. 单窗口嵌入式GUI的页面管理研究[J]. 计算机应用研究.2002年06期.
[2] 张娟,张雪兰. 基于嵌入式Linux的GUI应用程序的实现[J].计算机应用.2003 (04):116-117.
[3]王同洋,熊伟. 嵌入式Linux中图形用户界面的研究与设计[J].微计算机信息,2006, (08),90-92.
[4] W. Richard Stevens. Advanced Programming in the UNIX Environment. [M]. 北京. 人民邮电出版社,2005. 432-397.。

相关文档
最新文档