文献标识码: A
文章编号: 0258-7998(2012)10-0030-04
MeeGo嵌入式操作系统由英特尔和诺基亚倡导,旨在为手机、上网本、平板电脑、互联网电视、车载信息娱乐系统和多媒体电话等智能设备提供操作系统解决方案,并且有助于这些设备实现无缝集成。MeeGo融合了英特尔Moblin与诺基亚Maemo系统的精华,继承了分别掌握底层架构和终端设备优势的两大巨头的优秀基因。该嵌入式操作系统基于Linux架构,不仅支持所有x86处理器平台,还跨平台支持非x86架构的设备。面向跨平台的多元化设备,MeeGo为开发者提供了一致性的API,选择Qt框架作为应用程序的开发工具[1]。MeeGo SDK1.x中集成了基于Qt 4.7.x的Qt Creator 2.0,并引进了功能强大的Qt Quick,使得应用程序更加快速流畅地在MeeGo平台上运行。
1 MeeGo嵌入式操作系统架构
1.1 MeeGo的分层模型
MeeGo嵌入式操作系统的分层结构如图1所示,共包括三层:用户体验层、应用开发层、操作系统核心层。
用户体验层为不同的终端设备提供不同的应用框架,比如上网本采用了Clutter和MX界面开发库绘制界面;手持设备采用了MeeGo特有的触控框架,包括触摸、输入法、手势,为用户提供触控体验。MeeGo用户体验层集成了个人社交网络服务和底层基础库,全面支持网络服务、多媒体服务、最新电话技术等标准。强大的工具和动画效果简化了用户界面的定制。
应用开发层涵盖了MeeGo的应用开发接口,目前MeeGo release版本包含了Qt4.7、Qt mobility 1.0、Open GL ES 1.1和Open GL ES 2.0相关的类和接口。
操作系统核心层包含了所有中间件和操作系统的服务域以及硬件适配层。内核方面,MeeGo 1.0采用了Linux Kernel 2.6.33,支持多任务、本地应用开发框架、动画效果设计的开发框架、3D加速、最新Linux文件系统(btrfs)等。MeeGo 1.1支持Linux Kernel 2.6.35,新增支持Intel Atom Z6xx处理器和GCC4.5工具链。MeeGo 1.2支持Linux Kernel 2.6.37,新增Policy 开发框架和电源管理功能。
1.2 MeeGo的域视图
MeeGo嵌入式操作系统的域视图及各域的具体内容如图2所示[3],共包括12个域:安全域、系统域、个人信息管理域、软件管理域、数据管理域、多媒体域、定位服务域、通信域、内核域、核心组件域、Qt域和图形域。
内核域是应用程序和硬件层之间的桥梁,支持MeeGo的硬件平台需要提供三类相关组件(内核驱动、核心架构组件、内核配置文件)。内核驱动是一套需要与硬件进行交互的驱动程序,例如MeeGo notebook 1.1中集成了摄像头、USB、声卡、显卡、蓝牙及触摸屏等硬件驱动程序;核心架构组件是一个额外的软件包,将它附加到内核中以支持某些硬件的相关功能(如固件);内核配置文件为特定设备提供了详细的配置信息,包括设备架构、处理器类型、设备驱动配置菜单、网络支持以及内核调制选项等。
Qt域提供了跨平台开发工具(Qt、Qt Mobility、Qt Webkit、Qt WebRuntime),其中Qt提供了应用程序和用户界面的开发工具包,Qt Mobility为MeeGo提供了开发移动应用程序的接口,Qt WebKit能够快速创建包含实时网络内容和服务的应用程序。
2 搭建开发环境
2.1 Linux下安装配置Qt Creator
在Linux和Windows环境下均可以开发MeeGo应用程序。鉴于MeeGo操作系统是基于Linux内核并且是完全开源的,故选择了在Ubuntu 10.04 LTS系统上搭建MeeGo应用程序的开发环境。
为搭建MeeGo应用程序开发环境,在Ubuntu 10.04 LTS上安装配置QtCreator需要4个步骤,如图3所示。
(1)配置软件库安装源
①添加软件源:
deb http://repo.meego.com/MeeGo/sdk/host/repos/ubuntu/10.04//
②为软件仓库增加公钥:
$ gpg --keyserver pgpkeys.mit.edu --recv 0BC7BEC479FC1F8A
$ gpg --export --armor 0BC7BEC479FC1F8A | sudo apt-key add -
③更新软件源:
$ sudo apt-get update
④测试软件源是否正确安装:
$ apt-cache policy madde
(2)安装MeeGo SDK
$ sudo apt-get install meego-sdk-ia32
$ sudo apt-get meego-sdk-armv7l
如果开发基于x86架构设备的应用程序,相应的SDK需要安装meego-sdk-ia32;如果开发基于ARM架构设备的应用程序,则相应的SDK需要安装meego-sdk-armv7l。
(3)安装MeeGo目标机交叉编译环境
①下载并安装目标机交叉编译环境的压缩文件包:
$ sudo mad-admin create -f meego-netbook-ia32-1.1.2
②检查目标机交叉编译环境是否正确安装:
$ mad -t meego-netbook-ia32-1.1.2 pscreate -t qt-simple qthello
$ cd qthello
$ mad -t meego-netbook-ia32-1.1.2 qmake
$ mad -t meego-netbook-ia32-1.1.2 make
③检查目标机交叉编译环境是否正确运行:
$ file build/qthello
(4)配置Qt Creator
添加MeeGo交叉编译器,打开Qt Creator,选择Tools > Options > Qt4 > Qt Versions。点击“添加”按钮,路径选择为usr/lib/madde/linux-i686/targets/meego-netbook-ia32-1.1.2/bin/qmake,点击Rebuild按钮。如果不进行交叉编译,则可以添加MeeGo SDK 的Qt版本,步骤同上,但路径选择为/opt/meego/meego-sdk-qt/bin/qmake。
2.2 搭建基于Atom D510嵌入式实验平台的开发环境
Atom D510处理器针对MeeGo操作系统进行了优化,在Atom D510嵌入式实验平台下搭建MeeGo应用开发环境需要4个步骤,如图4所示。
(1)在Atom D510平台上安装MeeGo上网本操作系统
由于Atom D510嵌入式实验平台提供了UBS接口,最简单快捷的安装方式是使用U盘安装。首先,下载U盘镜像制作工具Win32DiskImager.exe和MeeGo上网本镜像文件;其次,制作MeeGo上网本系统启动U盘;最后,用该U盘重启实验平台,进入MeeGo上网本系统安装界面进行安装。
(2)安装OpenSSH sever
①安装OpenSSH sever。从主机Qt Creator向远程实体设备部署程序时,需要进行文件拷贝,因此需要在实体设备上安装OpenSSH服务。
$ sudo zypper install openssh-server
②启动SSH服务:
$ sudo /etc/init.d/sshd start
③将OpenSSH加入初始化序列中,开机自动启动:
$ sudo chkconfig --add sshd
(3)安装gdbserver
如果进行远程调试应用程序,需要安装gdbsever。
$ sudo zypper install gdb-gdbserver
(4)配置实际设备连接
打开Qt Creator,选择Tools→Options→Projects→MeeGo Device Configurations。点击“添加”按钮,添加一个程序运行的实际设备。设置Device type为Real Device、Authentication type为Password、Username为root、Password为meego。SSH使用默认端口号22,Gdb Server使用默认端口号10000(如果该端口被占用可使用其他端口)。
除此之外,如果开发主机与实际设备使用交叉网线进行通信,则两者的IP地址必须配置在同一网段内。如果使用局域网进行通信,则开发主机与实际设备接入同一局域网即可。
2.3 QEMU虚拟机下搭建开发环境
在QEMU虚拟机下搭建开发环境,需要安装MeeGo运行时(即运行在QEMU中的MeeGo操作系统镜像)。安装配置QEMU运行时需要4个步骤,如图5所示。
(1)安装MeeGo运行时
$ sudo mad-admin create -f -e meego-netbook-ia32-qemu -1.1.2-runtime
如果运行时安装成功,则执行下述指令:
$ sudo mad-admin list runtimes
屏幕将显示meego-netbook-ia32-qemu-1.1.2-runtime (installed)安装MeeGo SDK。
(2)在Qt Creator中配置MeeGo仿真器
打开Qt Creator,选择Tools→Options→Projects→MeeGo Device Configurations。点击“添加”按钮,为仿真器添加一个runtime(运行时)。设置Device type为MeeGo Emulator、Authentication type为Password、Username为root、Password为meego。SSH使用默认端口号为6666。Gdb Server使用默认端口号为13619(如果该端口被占用可使用其他端口)。
(3)启动MeeGo运行时
$ sudo mad remote –r meego-netbook-ia32-qemu-1.1.2-runtime poweron
如果运行时不能正常启动,可能有两个原因:①开发主机BIOS禁用了Virtualization Technology,进入主机BIOS开启Virtualization Technology即可解决问题;②开发主机没有加载KVM模块。
对于Intel处理器,执行$ sudo modprobe kvm_intel指令可加载KVM模块
对于AMD处理器,执行$ sudo modprobe kvm_amd指令可加载KVM模块
(4)用SSH登录运行在QEMU中的MeeGo镜像
$ ssh meego@127.0.0.1 -p 6666
MADDE启动QEMU时,完成了从主机6666端口到MeeGo镜像SSH端口的重定向。目前MeeGo 镜像中有如下两个帐号:①用户名:meego 密码:meego;②用户名:root 密码:meego。
3 应用程序开发流程
(1)新建一个Qt工程。在Qt Creator开始界面,点击右下角Creat Project按钮,创建Qt工程。
(2)根据目标设备选择合适的应用程序模板。开发MeeGo上网本应用程序,需要选择Qt C++ Program工程中的Mobile Qt Application模板。
(3)使用工程向导,逐步设置工程的名称、路径、Qt版本信息、程序类信息、工程管理信息。程序类信息包括:类的名称、基类、头文件、源文件和Form文件。工程管理信息列出了工程的路径和工程中所有的文件。
(4)编写相应的应用程序代码,设置应用程序运行环境。如果目标设备为MeeGo虚拟机,则将Device configuration设置成meego emulator;否则将其设置为实体设备。设置完成后,依次点击编译和运行按钮,应用程序即可部署到目标设备上并运行。
4 应用程序集的设计与开发
4.1 总体设计方案
应用程序集总体结构如图6所示,由主操作界面、办公模块、通信模块、娱乐模块、地图模块组成。通过主操作界面可启动不同子模块,子模块之间不能直接互相切换,子模块必须返回主操作界面才可启动其他子模块。通过子模块界面可启动相应的应用程序。
进入子模块后,主操作界面切换为子模块的操作界面。两个模块的主操作界面的结构完全相同,只是六面体每个面的功能不同。以办公模块为例,其上下两个面的功能为返回主操作界面,前后左右4个面分别代表了文本编辑程序、表格处理程序、图片浏览程序和保留的扩展程序接口。
六面体的每个面均使用OpenGL逆时针正向绘制。六面体通过加载相应的纹理代表不同的模块或者应用程序。首先加载用来生成纹理的图片,然后生成纹理,最后加载纹理[4]。在绘制面之前调用glLoadName()函数,使用名字栈为六面体的面设置名字。通过调用facceAtPosition()私有函数确定光标下的面。程序使用面的名字和shift_flag变量来实现主操作界面和子模块操作界面的相互切换。
(2)子模块的设计与实现
办公模块设计实现了图片浏览程序、文本编辑程序、表格处理程序;通信模块设计实现了新浪微博客户端和局域网通信程序;娱乐模块设计实现了连连看游戏、贪吃蛇游戏和拼图游戏;地图模块设计实现了北京地铁线路查询程序和Google在线地图程序。
在此只介绍地图模块中的北京地铁线路查询程序。该程序涵盖了北京地铁七条干线,并实现了任意两个站点之间的最短路径查询和动态显示。该程序使用图存储地铁线路信息。地铁线路图中共有115个站点,每个站点分配了唯一的ID标识为图中的一个顶点。如果两个站点直接相连,则将这两个站点之间弧的权值设置为1,否则设置为10 000,表示这两个站点没有直接相连。程序使用著名的弗洛伊德最短路径算法,通过图的权值矩阵求任意两个站点之间的最短路径。通过定时器和变换画刷的颜色来实现查询结果的动态显示,每0.7 s更新一次地图,如果用户正在进行线路查询,则变换画刷的颜色闪动线路上站点。
4.3 应用程序设计举例
以Google在线地图为例,本应用程序使用MeeGo Qt域的Qt WebKit进行开发,总体的开发流程与本文第3节“应用程序开发流程”相同。在此,只叙述程序代码的编写。
(1)为了使用Qt WebKit,需要在工程的.pro文件中添加QT += webkit,并在相应头文件中添加#include
<QwebView>。
(2)新建一个QWebView类的控件对象:
QWebView *mapview = new QwebView();
(3)调用该控件对象的setUrl函数,设置其显示内容为Google在线地图:
mapview->setUrl(QUrl("http://ditu.google.cn/"));
(4)设置控件的窗口名字并将其显示:
mapview->setWindowTitle("Google在线地图");
mapview->show();
本文论述了MeeGo嵌入式操作系统的运行机制和应用程序的开发流程,以及在Linux平台上搭建MeeGo应用程序开发环境和使用Qt Creator开发应用程序集的方法和步骤。
参考文献
[1] 英特尔开源技术中心.MeeGoTM开源项目白皮书[Z].2010.
[2] The Linux foundation.MeeGo architecture layer view [EB/OL].[2010-10-20].https://www.meego.com/developers/ meegoarchitecture/meego-architecture-layer-view.htm.
[3] The Linux foundation.MeeGo architecture domain view[EB/OL].[2010-10-20].https://www.meego.com/developers/meego-architecture/meego-architecture-domain-view.htm.
[4] WRIGHT R,LIPCHAK B.OpenGL超级宝典(第四版)[M]. 张琪,付飞,译.北京:人民邮电出版社,2010.