基于Linux的嵌入式GUI研究与应用

发布者:dandan666最新更新时间:2012-03-24 来源: 微计算机信息关键字:Linux  嵌入式GUI  输入引擎 手机看文章 扫描二维码
随时随地手机看文章

1.引言

嵌入式GUI指在嵌入式系统中为特定的硬件设备或者环境而设计的图形用户界面系统。它极大地方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过窗口、菜单方便地操作。在实际应用中,嵌入式GUI应满足轻型、占用资源少、高性能、高可靠性、可配置等基本要求。

Linux作为一种可裁减的操作系统,兼容多种主流CPU且支持所有的文件系统和网络服务,并具备源代码公开、易于定制、稳定、功能强大和易开发等优点,是发展未来嵌入式设备的绝佳资源。

2.Linux在嵌入式系统上的实现
2.1系统引导

系统上电或者复位后,将对系统硬件设备进行自检,无错误则将硬盘0磁道的第一个扇区,即MBR中的BootLoader调至内存0x07C00处,并将控制权交给BootLoader[1]。BootLoader通常是一段汇编代码,存放在MBR中,作用是将系统启动代码读到内存中。目前可选用的引导工具主要有GRUB和LILO,这里我们选用主流的GRUB,由于选用的存储介质是CF卡,格式化CF卡后建立GRUB安装目录,按照提示安装GRUB后,在 /etc目录下新建grub.conf文件,内容如下:
default=0
timeout=5
title Linux-2.4.34
root (hd0,0)
kernel /boot/vmlinuz-2.4.34 ro root=/dev/hdc1 
其中root (hd0,0)指定了/boot所在的分区,kernel一行用来指定Linux的内核,及/所在的分区。

2.2内核配置、编译及裁减

内核是Linux操作系统的核心,它负责管理系统进程和进程调度等大小事务,决定着系统的性能和稳定性,其它应用程序都必须通过它才可以使用系统资源,获取系统服务。由于嵌入式硬件资源的限制,我们需要对Linux内核进行定制,精简出符合实际需要的最小内核文件。
首先在www.kernel.org上获取相应的内核包,解压后进行配置,然后根据目标板的硬件特点和实际需求配置内核的编译选项。这里我们选用基于X86 架构的PC104主板,为了减低不必要的复杂性,内核中取消kernel module支持,将有关CPU类型、内存管理、doc驱动、ext2文件系统支持、串口支持等常用功能编译进内核,SCSI、Floppy之类的外设在我们的嵌入式系统中没有使用,编译时可去掉。这样实际编译出的内核只有 747.6KB。基本步骤如下[2]:
#cd /usr/src/linux  //内核包所在目录,这里下载的内核包版本是2.4.34
#make mrproper   //确保源代码目录下没有不正确的.o文件以及文件的相互倚赖关系
#make menuconfig //图形界面下编译选项配置

#make dep       //确保关键文件在正确位置
#make clean      //确保所有有关文件都处于最新版本状态
#make bzImage   //编译内核
#cp /usr/src/linux/arch/i386/bzImage /mnt/cf/boot  //将内核文件拷贝至boot 

2.3根文件系统实现

Linux 的根文件系统以树的结构方式组织,主要由配置文件、设备文件、Linux基本命令、基本C语言库组成。后两者是主要的,也是占空间最大的,用 Busybox和uClibc的组合够建这两部分内容,可以大大节省空间。根据根文件系统的基本结构,我们建立各个对应的目录:
#mkdir proc dev bin boot boot/grub etc src lib  //由于是单用户系统,删除了root、home、sbin目录
#cp –r /dev/null /dev/mem … /mnt/cf/dev     //拷贝所需设备文件      

最后需要在etc目录下建立几个配置文件,分别是/etc/inittab、/etc/init.d/rcS、/etc/fstab,限于篇幅,仅介绍inittab文件,内容如下[4]:
:: sysinit: /etc/init.s/rcS           //指定初始化文件
:: askfirst: /bin/sh               //启动时执行的shell
:: respawn: /bin/getty 38400 ttyS0  //打开一个串口,波特率为38400
:: restart: /bin/init               //重启时执行进程init
:: ctrlaltdel: /bin/reboot          //捕捉特定按键动作
:: shutdown: /bin/umount –a –r    //关机时动作,卸载所有文件系统

3.嵌入式GUI研究
3.1基于嵌入式Linux的GUI系统底层实现基础

一个能够兼容多硬件平台的嵌入式GUI系统,应至少抽象出两类设备:基于图形显示设备(如VGA卡)的图形抽象层 GAL(Graphic Abstract Layer)和基于输入设备(如键盘,触摸屏等)的输入抽象层 IAL(Input Abstract Layer)[3]。抽象层的概念类似Linux内核虚拟文件系统的概念,它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口上,而用于实现该抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序,这实际是一种面向对象的程序结构。利用该抽象接口,嵌入式GUI可以非常方便的移植到其他POSIX系统上,只需要根据抽象层接口实现新的引擎即可。[page] 

3.2嵌入式GUI基本性能需求

嵌入式GUI应在基于操作系统的基础上,为用户提供丰富的图形编程接口,使其能够方便快速的编制界面友好的应用程序。
GUI模块的性能指标为单位时间实例化个数,如下所列:
基本图形绘制速度,即点、线、框、块、圆、弧、椭圆等图形单元绘制速度。在显示设备可见范围内任意位置产生随机大小的基本图形。量化指标为单位时间内绘制的个数,并以较长测试时间中取得的单位时间平均值为准。
窗口创建速度。在显示设备可见范围内任意位置创建随机大小的窗口。量化指标为单位时间内成功创建及绘制完毕的窗口个数,并以较长测试时间中取单位时间平均值为准。
控件创建速度。在显示设备可见范围内任意位置创建随机大小、包含随机内容的窗口。量化指标为单位时间内成功创建及绘制完毕的控件个数,并以较长测试时间中取单位时间平均值为准。
事件驱动机制反应速度。针对窗口及不同控件的典型事件及耗时事件,测试其完成时间。窗口及控件的大小、复杂程度随机产生。量化指标为单位时间内成功处理完毕的事件数,并以较长测试时间中取单位时间平均值为准。

3.3输入引擎移植

在基于Linux的嵌入式系统中,输入设备可能只有触摸屏和为数不多的按键,相对图形引擎来说,输入设备的处理没有统一接口,在此情况下,提供一个抽象的输入层,显得尤为重要。
这里我们参考MiniGUI,并结合实际工程机械控制系统来实现输入引擎的移植工作。MiniGUI简单可分为三层,最顶层为API,即编程接口;中间层是 MiniGUI的核心层,其中包括了窗口系统必不可少的各个模块,如消息事件处理模块、图形设备接口等;而最底层则是GAL和IAL。
该实际工程机械控制系统拟采用触摸屏作为主要的输入设备,需要编写自己的输入引擎。首先定义一个结构体用来从触摸屏设备(/dev/ts)中接受数据,结构体定义如下:
typedef struct
{
       unsigned short b;      //触摸屏状态(是否被点击)
       unsigned short x;      //触摸屏x坐标
       unsigned short y;      //触摸屏y坐标

unsigned short pad; //32位填充域,无实际意义
      } POS;
接下来定义输入引擎的初始化函数,该函数打开触摸屏设备文件:/dev/ts,类似PC上的/dev/psaux设备。在成功打开设备文件后,该函数通过 mouse_getxy和mouse_getbutton等函数将获得的状态信息通过INPUT结构体传递给GUI应用程序。
BOOl InitPADInput (INPUT*input,const char*mdev,const char*mtype)
{
ts = open(“/dev/ts”, O_RDONLY);
if (ts<0) {
fprintf (stderr, “PAD:Can not open touch screen!\n”);
return FALSE;
}
……
input->get_mouse_xy=mouse_getxy;
       input->get_mouse_button=mouse_getbutton;
……
}
static void mouse_getxy(int* x, int* y)
{
*x=mousex;
*y=mousey;
}
static int mouse_getbutton(void)
{
return pos.b;
}
最后通过wait_event函数调用select系统调用,当select系统调用返回值大于0时,该函数检查是否有可读的数据等待读取,如果是,则从该文件描述符中读取触摸屏数据。
限于篇幅原因,这里只列出了其中输入引擎的移植代码中较为关键的部分。代码编写完成后,还需要在“/src/ial/ial.c”中添加自定义的输入引擎的入口项。
static INPUT inputs [] = 
  { ……
#ifdef _PC104_IAL
{"pc104", InitYKInput, TermYKInput},
#endif
……
    }

4.结束语

本文具体介绍了Linux作为嵌入式操作系统的实现方法,结合嵌入式GUI技术,在PC104主板上利用Linux创建了一个拥有用户界面的微型操作系统,并通过对抽象层接口及相关技术的分析,自定义输入引擎,实现了设备的可定制,在实际工程机械项目中有较大的实用价值和市场前景。
创新点:利用Linux在嵌入式主板上搭建了一个微型操作系统,在此基础上实现了针对触摸屏的输入引擎的移植。

参考文献:
[1] GRUB主页[EB].http://www.gnu.org/software/grub
[2] Linux内核主页[EB].http://www.kernel.org
[3] 魏永明等.Linux/uClinux + MiniGUI:嵌入式系统开发原理、工具及过程[M].北京:飞漫软件公司,2006
[4] 马记平等. 嵌入式Linux操作系统在PC104上的实现[J].微计算机信息,2007,2-2:39-41

关键字:Linux  嵌入式GUI  输入引擎 引用地址:基于Linux的嵌入式GUI研究与应用

上一篇:基于WinCE系统的FIFO数据传输程序设计
下一篇:基于机器视觉的公路车流量检测系统研究

推荐阅读最新更新时间:2024-03-16 12:56

如何在linux环境下使用gcc进行stm32项目开发
背景 我之前一直是从事单片机相关的开发工作,对于STM32平台的开发,都是在keil中进行的。后来转为搞linux相关的开发了,发现开发工具是大大的不同,linux下的开发都是makefile+gcc+gdb,写代码也是用sourceInsight,代码的编译也是在服务器上进行的,没有了集成开发环境,当对这样的开发模式逐渐熟悉之后才发现Makefile真的很强大,开发效率高,对底层细节也是掌握了很多,弥补了不少盲区。keil工具虽然十分方便,但对于开发人员来说,隐藏了太多的细节,灵活性不高,对于高级应用显得力不从心了。因此在习惯了linux平台的开发之后,我萌生了一个想法:在linux下进行stm32的开发,这里涉及到的开发环境的
[单片机]
如何在<font color='red'>linux</font>环境下使用gcc进行stm32项目开发
学会编写Linux设备驱动
内核版本: 2.4.22 阅读此文的目的: 学会编写Linux设备驱动。 阅读此文的方法: 阅读以下2个文件: hello.c,asdf.c。 此文假设读者: 已经能用C语言编写Linux应用程序, 理解"字符设备文件, 块设备文件, 主设备号, 次设备号", 会写简单的Shell脚本和Makefile。 1. "hello.c" -------------------------------- /* * 这是我们的第一个源文件, * 它是一个可以加载的内核模块, * 加载时显示"Hello,World!", * 卸载时显示"Bye!"。 * 需要说明一点,写内核或内核模块不能用写应用程序时的系统调用或函数库, * 因为我们写的就
[嵌入式]
基于Linux系统的指纹识别门禁系统
  指纹作为人体的身体特征,具有唯一性、稳定性和不易盗用等特点。随着指纹识别理论逐渐成熟、指纹采集工具这一难题得到解决,指纹识别已经成为目前最广泛应用的生物识别之一,逐渐取代了传统的认证识别方式,广泛应用于金融、公安、证券、门禁系统等领域。指纹识别技术的研究已经成为当前建筑智能化研究的热点。但是对于在Linux 系统下的由FPI 指纹识别模块、Raspberry Pi 主控模块、AVR 模块组成的,采用无线通讯方式定时向用户发送邮件来监控门锁状态的指纹识别系统的研究至今未见诸报端。本文在不改变现有门锁结构的前提下,通过设计编程,开发了一套基于指纹识别的门禁系统,定时检测门锁状态并向用户发送报警邮件,大大增强了门锁的安全性。   1
[电源管理]
基于<font color='red'>Linux</font>系统的指纹识别门禁系统
在ubuntu8.10 下建立 ARM-Linux 交叉编译环境
很久都没有写文章了 ,经过了将近半年的奔波,终于可以写点东西了!在广州工作时 ,同事极力推荐我用ubuntu,使用之后的确很爽,并决定以后在ubuntu下工作,完全可以抛弃windows(晕到死)。决定开始 移植Linux到mini2440。首先就是在ubuntu下建立交叉编译工具链。借着在Fedora 下建立ARM-Linux的交叉编译工具的经验,按理说应该是不会有问题的,但是结果是比在Fedora下碰到的问题多得多了。以下先介绍成功编译的过 程,碰到的问题和解决办法后面说。 这次编译过程中对我有重大帮助的资料有: 《 编译Mysql时configure: error: No curses/termcap library fou
[单片机]
嵌入式Linux系统下Microwindows的应用
摘要:通过对嵌入式GUI软件Microwindows进行分析并与X window进行对比,阐述Microwindows用于嵌入式设备上的优点;简要论述Microwindows的体系结构和图形应用程序接口;介绍其设备驱动特性、API、客户机/服务器模型、画图机制和FLTK。 关键词:嵌入式系统 Microwindows Linux 引言 在进入后PC时代以后,嵌入式设备以一种无法抑制的迅猛速度普及和发展到日常生活及工作当中,众多知名开发商为了抢占市场和争夺利润,竞相推出各种性能优异的软硬件及内核芯片。鉴于以视窗为代表的桌面操作模式取得巨大成功,该模式目前已成为国内外开发者们在嵌入式设备中的首选方案。 近几年,随着Linux技
[嵌入式]
移植Linux-5.4+内核到4412开发板
前言 ITOP-4412开发板被 Linux 官方支持,所以我们在4412上学习新的内核是非常方便的,本文作者是4412精英群8群一位技术高手,接下来,我们一起来欣赏下他的表演。 环境说明 OS版本 Ubuntu 20 LTS 交叉编译环境配置 ~$ sudo apt install gcc-arm-linux-gnueabihf ~$ sudo apt install flex ~$ sudo apt install bison ~$ sudo apt install u-boot-tools 目标开发板 CPU (Exynos4412,四核 Cortex -A9,主频为1.4GHz-1.6GHz) RAM (1GB 双通道
[单片机]
移植<font color='red'>Linux</font>-5.4+内核到4412开发板
基于USB设备的Linux网络驱动程序开发
1 引言 做为开放源代码 (Open Source) 运动重要组成部分,Linux操作系统吸引了数以万计的程序员共同开发。由于Linux比较完整的继承了各种UNIX版本的稳定和高效,并且克服和改进了传统UNIX中的很多缺点,更因为其开放的开发模式,Linux成为一个具有强大网络服务功能的操作系统。它支持主流的TCP/IP以及IPX/SPX、 NETBEUI等众多网络协议,无论在嵌入式系统,服务器还是桌面操作系统领域,Linux都取得了广泛的应用。网络驱动程序和网络硬件设备实现网络协议栈中的数据链路层和物理层,对上层协议提供支持,是网络协议栈的重要组成部分,对Linux的网络性能起着决定作用。本文主要讨论基于USB总线的 Linux
[单片机]
基于USB设备的<font color='red'>Linux</font>网络驱动程序开发
ARM与嵌入式linux的入门建议
由于很多人总问这个问题,所以这里做一个总结文档供大家参考。这里必须先说明,以下的步骤都是针对Linux系统的,并不面向WinCE。也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。我一直很难理解,其实WinCE的界面比linux的界面好看多了,使用起来也很方便,更为重要的是,WinCE的开发和Windows下的开发基本一样,学起来简单得多,但是学linux或者使用linux做嵌入式的人就是远比WinCE多。在和很多工作的人交流时我了解到,他们公司从没考虑使用WinCE,因为成本高,都是使用linux进行开发。我读研究生的的实验室中也没有使用WinCE的,大都
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved