基于dbus的嵌入式系统应用程序接口的分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
独创性声明
本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。
尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。
对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律结果由本人承担。
学位论文作者签名:
日期:年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
保密□,在年解密后适用本授权书。
本论文属于
不保密□。
(请在以上方框内打“√”)
学位论文作者签名:指导教师签名:
日期:年月日日期:年月日
1 绪论
近些年来,嵌入式系统领域有了飞速的发展。
随着嵌入式系统处理能力越来越强,功能越来越多样,嵌入式系统应用范围越来越广,计算机的概念不仅仅是以前那种放在桌面上进行科学计算和文档处理的计算机了。
现在,通常所说计算机不仅包括大型机、桌面台式机,还包括各种各样、大大小小的嵌入式电子设备。
嵌入式电子设备包括小到MP3、PDA等各种数字化产品,大到智能家电、车载电子等设备。
但是,随着嵌入式设备应用领域的不断扩大,我们所涉及的开发系统的规模不断扩大,复杂性不断提高,传统的嵌入式系统软件设计方法已经远远不能满足我们的要求。
嵌入式系统的开发已经不是以前那种几个人甚至是一个人就可以完成的事情了。
对一个大型的系统如何提高代码系统的分析和设计的质量,如何更好的实现代码的重用,加快开发的速度和减轻开发人员的负担,如何使开发具有继承性,能够继承以往的开发工作。
这些问题已经显得越来越重要,迫切需要我们对整个嵌入式系统的设计和开发在方法论上面进行一些很好的总结和创新[1]。
1.1 课题研究背景
随着后PC时代的来临,嵌入式设备已经越来越多地应用于各个领域,尤其在32位嵌入式微处理器出现后,嵌入式操作系统与其结合而产生的嵌入式系统,具备更好的稳定性和开放性,在各行业技术革新中发挥着重要作用[2]。
然而嵌入式系统作为一种紧凑型专用计算机,受系统资源限制,其软件开发有以下特点:(1)嵌入式系统软件开发依赖于专门的硬件平台,如特定的微处理器和外围设备。
此外嵌入式系统软硬件通常是同步开发的,即开发初期开发者面临硬件平台不确定的状况。
(2)嵌入式系统软件开发还依赖于底层的实时操作系统(RTOS),复杂的实时多任务程序需要专门的RTOS作为任务调度平台,开发过程中也需要使用RTOS附带的集成开发环境和应用程序接口。
(3)嵌入式系统软件开发遵循传统软件开发模式,但它需要一些专门的开发工
具。
创建和调试嵌入式软件的编译器、汇编器和调试器更加原始,由于作了专门优化,其质量和效率也更高。
(4)出于对软件运行性能的担忧,嵌入式系统软件编程语言的选择范围非常有限。
过去通常采用C语言、汇编语言等,汇编语言提供直接访问硬件的能力并具有极高的效率,但应用汇编实现的程序移植性差;C是主流开发语言,因为它既具有低级语言汇编语言的非常高的执行效率,同时还具有高级语言的可读性高、易编程、模块性好、可移植性高等特点[3-4]。
(5)嵌入式系统软件开发受开发资源的严格制约,如成本、体积和功耗。
开发者必须面对目标平台的处理速度和存储能力有限的事实,并尽可能满足来自应用的功能和非功能要求。
由于嵌入式软件开发的这些特点、用户需求的发展、应用的复杂,嵌入式系统的软件开发面临着严峻的挑战[5]。
一方面随着应用领域复杂性的提高,嵌入式系统软件的种类、数量也不断增加,代码量在1兆行的嵌入式程序非常普遍。
同时处理器计算能力的提高以及相应在体积和成本方面的降低,使得越来越多的过去由精巧的机械或电子设备完成的功能改由软件实现,这进一步加剧了嵌入式系统软件开发和评估的难度。
另一方面,激烈的市场竞争要求开发者必须在尽可能短的时间内以尽可能低的成本开发出尽可能可靠的软件产品,传统的基于过程、以编程为中心的开发方法难以适应新的环境对开发效率和质量的要求而成为开发过程的瓶颈。
总体而言,现在的嵌入式软件开发面临着一些共性的问题:
(1)从软件开发过程看,为了节约系统资源消耗,嵌入式应用软件基本采用面向过程的开发方式,代码复用度低,在面对复杂的多任务应用功能实现时,很难展开并行的开发和调试,这是限制嵌入式应用软件开发效率的一个重要因素[6]。
(2)嵌入式应用软件常需要对硬件驱动接口进行操作,而嵌入式设备应用对象干差万别,多种多样的嵌入式操作系统之间兼容性差,往往需要针对不同的硬件编写操作系统内核移植代码。
(3)在工程应用中,许多嵌入式软件进行代码升级、功能扩展时,需要向嵌入式操作系统平台做代码移植。
领域工程和应用工程中,基于复用的软件生产技术是
其关键技术。
然而上述问题造成了嵌入式软件开发效率低,开发周期长,且影响了产品的可靠性、移植能力和市场响应能力。
目前嵌入式软件开发需要很好解决以下问题:①软件复用问题,包括功能代码复用和过程代码复用[7-9]。
②抽象层开发问题,包括目标硬件平台的抽象层开发和操作系统抽象层开发。
1.2 课题研究的目的与意义
随着嵌入式应用的迅速增长,传统的嵌入式软件开发方法已经不能适应日益增长的嵌入式市场对产品研发的要求。
为了提高嵌入式软件的开发效率、代码的复用率、程序的扩展性和程序运行的效率[10],本文提出了一种基于桌面总线DBUS (Desktop BUS)的嵌入式系统应用程序接口。
DBUS是一种高效的进程间通信机制。
传统的嵌入式软件设计大多数都是以一个进程为主,而Coral把整个系统分成多个相互独立的小程序,每个小程序是一个独立的进程,这些小程序通过DBUS进行通信。
因此,对整个系统的管理就变成了对这些相互独立的小程序的管理,这样做不仅便利了对整个系统的管理,还可以让不同的开发人员同时开发不同的模块,加快系统的开发效率。
Coral运用了框架的概念。
框架指的是构成一类特定软件可复用设计的一组相互协作的类,描绘出了一个待建应用系统的主要结构[11]。
建立在框架基础上的应用程序只需要根据具体需求定制功能部分,因此能更容易地生成应用程序。
利用框架生成的程序具有相似的结构,这使它们更容易维护,用户看起来也更一致。
按照框架的组织结构可以把框架分为垂直框架和水平框架。
垂直框架围绕某个特定领域进行组织,如金融系统、实时系统、嵌入式系统等。
特定领域一般具有较丰富的元模型,因此垂直框架通常更专用、更复杂。
本文提出的嵌入式实时软件框架模型就是一个垂直框架。
水平框架提供开发应用程序基本结构的方法,或者在公共平台上运行,面向的是一般应用程序的公共功能。
例如微软的MFC(Microsoft Foundation Classes)就是一个通用的Windows应用程序开发的水平框架。
1.3 国内外研究成果
针对当前嵌入式系统软件开发面临的危机和困境,已有许多研究者将目光对准
了这一新兴的领域,并提出了许多卓有成效的研究成果,包括基于模型的设计、基于平台的设计、基于事件驱动的设计和基于组件的设计[12-13]。
当前以美国加州理工大学的研究学者为主的国外研究人员对该领域作了深入的理论研究,而国内的研究相对要缓慢一些。
这些研究大多偏重于理论证明或采用形式化方法描述,对具体的实现过程涉及较少[14]。
下面我们介绍几种当前国内外主要的嵌入式软件体系结构。
(1)传统的层次型体系结构[15]。
专用的嵌入式设备,其嵌入式应用软件层通常为一个进程,实现某个特定的功能。
嵌入式操作系统层集成了完整的文件管理、进程管理、内存管理、网络管理、电源管理等功能。
硬件驱动层实现对特定外设的直接访问,提供系统访问接口。
开发一个具有特定功能的嵌入式设备,必须具备相关硬件、软件、嵌入式操作系统和特定领域知识,这对开发人员提出了相当高的要求,而且当开发新的嵌入式设备时,代码复用度很低。
传统的嵌入式系统层次型体系结构如图1.1所示。
图1.1 传统的层次型体系结构
(2)改进的层次型体系结构[16],也称基于ICS(intertask communication and services)的多进程系统结构,如图1.2所示。
该结构在《改进的嵌入式软件架构及其应用层开发模式》论文中提出[17]。
在这种体系结构中,嵌入式应用软件层由多个进程组成,它们协调工作,共同完成一个嵌入式设备的特定功能。
ICS即任务间通讯服务,它是论文作者所在的项目组基于套接字和UDP协议研发,用于嵌入式设备应用层的复杂功能实现而开发的。
它独立于操作系统,由3部分组成:
ICS客户端:需要使用任何ICS功能的进程。
ICS服务器:实现远程计算机上的邮箱访问任务。
ICS节点检查器:控制是否允许当前应用程序指定的ICS邮箱能够通知。
当某一进程需要使用ICS邮箱时,必须登记注册该邮箱,ICS服务器将通过发送“事件”消息到该邮箱通知其是否能用。
基于ICS消息通讯机制,则可把整个控制系统的功能进行分割,把相对独立的任务以独立进程来实现。
任务进程化使得各任务的内部实现变得独立和清晰,各任务间的通讯和数据交互通过不同类型的ICS消息来实现。
应用层功能软件由多个任务进程组成,其中的进程管理进程是一个总的控制进程,它负责监控所有任务进程的状态、通过发送ICS消息命令控制其状态切换(每个进程都具有初始态、挂起态、运行态和终止态)。
所有任务进程也都基于ICS通讯机制与其它相关进程通讯。
图1.2 改进的层次型体系结构
此软件体系结构虽然可以提高软件的复用性以及系统的可扩展性,但是还是存在以下的缺点:首先,ICS是一个基于UDP协议的进程间通信服务,而UDP是无连接的,这样就可能导致丢失消息。
然后,ICS是一种基于C/S(Client/Server)模式的通信服务,在系统复杂、功能模块多的情况下,服务器端可能不能承受这么重的负载而导致服务端崩溃。
最终,此体系结构没有一套方便使用的接口层,方便开发人员使用。
(3)基于组件的嵌入式软件开发[18]。
基于组件的软件开发是当前的一个研究热点,对该领域贡献较大的是软件体系结构理论,体系结构理论引入了组件、端口以及连接器作为最基本类的表示 [19]。
目前,基于组件的软件开发方法已成为主流的通用软件开发方法之一,3种标准的组件技术是DCOM、CORBA和JavaBeans,但这些组件标准只适用于某一平台上通用软件的开发,没有考虑非功能需求,而嵌入式软件通常是专用、依赖于平台、有严格的非功能需求,导致难于开发、维护、升级和定制,而且移植到其它平台也非常困难。
1.4 本文的组织
本文提出了一种新的嵌入式系统应用程序接口:Coral-基于DBUS的嵌入式系统应用程序接口,对比了Coral与传统嵌入式系统软件设计结构,实现了Coral的DEMO,并给出了Coral的一个实际用例。
全文的主要内容分为以下章节:第一章是本文的绪论部分,主要介绍了本课题的研究背景,本课题的研究目的与意义,及本课题的在国内外的研究状态。
第二章简单的介绍了DBUS。
Coral是基于DBUS的,所以本文第二章简单的介绍了什么是DBUS,DBUS的结构、特点和DBUS的用例。
第三章详细的讨论了Coral的系统结构,Coral的组成部分,Coral的优缺点,以及如何用Coral设计应用层软件。
第四章叙述了Coral的实现。
第四章叙述了Coral的DEMO版本的实现,介绍了Coral进程间如何使用DBUS进行通信,讨论了如何编写一个Coral Service,以及如何组合整个Coral模块。
第五章讲叙了Coral的一个实际用例。
在第五章中,作者结合自己的实际项目,运用Coral开发了一套应用程序。
第六章对全文进行了总结,提出了不足之处。
2 桌面总线技术的分析
桌面总线DBUS是一种高级的进程间通信机制,它由项目提供,使用GPL许可证发行,主要的用途是在Linux桌面环境中提供进程间通信。
2.1 桌面总线的简介
DBUS是一个适用于桌面应用的进程间的通讯机制,即所谓的IPC(Inter-Process Communication)机制[20]。
适合于同一台机器,不适合于INTERNET的IPC机。
DBUS 不是一个为所有可能的应用的通用的IPC机制,不支持其他IPC机制的很多特性。
DBUS提供了一个低时延、低消耗的IPC通讯。
DBUS最主要的用途是在 Linux桌面环境中为系统进程提供通信,同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。
DBUS的主要对象是总线,注册后的进程可通过总线接收或传递消息,进程也可注册后等待内核事件响应,例如等待网络状态的转变或者计算机发出关机指令。
目前,DBUS已被大多数Linux发行版所采用,开发者可使用DBUS实现各种复杂的进程间通信任务。
图2.1 DBUS的体系结构
DBUS是支持一对一和多对多的对等通讯,在一对一的直接通讯时,两个应用程序连接在一起,这是最简单的工作方式。
在多对多的通讯时,这就需要一个叫DBUS后台的角色去分转,一个应用程序发消息给另外一个应用程序,先到达后台,再让后台将信息发送到目的应用程序。
在这里DBUS后台就充当着一个路由器的角色。
DBUS的结构如图2.1所示。
2.2 桌面总线的树形结构
在DBUS系统中,可以包含多条总线,一条总线可以包含多个对象,一个对象可以包含多个接口,一个接口可以包含多个方法和信号,把这些元素组合起来就是一棵树。
2.2.1 DBUS总线
DBUS为应用程序提供了多条消息总线,让应用程序可以相互通信。
每一条总线有自己的连接设备,这样各条总线就可以传递不同的消息。
也就是说,一条总线上的消息不能被另一条总线获取,而连接在同一条总线上的应用程序可以相互通信。
多个应用程序可以在任何时候连接到任意的一条总线上,而且,一个应用程序可以同时连接多条总线。
这样,应用程序可以有效的共享全局和本地消息,但是,不同的总线需要采用不同的安全策略[21]。
支持DBUS的系统都有两个标准的消息总线:系统总线和会话总线。
系统总线用于向系统发送消息,当有新的硬件可以利用的时候,比如USB的插入或者DVD 光碟的插入等等。
系统总线在内核引导的时候被载入到内存中,只有Linux内核、Linux桌面环境和权限较高的程序才能向该总线写入消息,以此保障系统安全性,防止有恶意进程假冒Linux发送消息。
会话总线用于应用之间的通信。
每一个桌面会话都有一个或多个相关的回话总线。
除此之外,两个应用程序也可以创建一条私有的总线,是有这两个应用程序可以在这条总线上通信。
2.2.2 DBUS消息
总线通信的最基础单元是消息。
所有在总线上传递的信息都以消息的形式存在,
和TCP/IP用包的形式来传递信息类似。
但是,不像网络中的数据包,每一个总线消息都确保含有全部的数据,并且还记录了发送者和接收者的相关信息用来进行路由。
调用者将调用的方法、方法的参数打包进一个消息,接收者将方法和参数从消息中解包出来,执行这个方法调用。
执行完后,将结果打包进返回消息中,返回给调用者。
消息有四种类型,分别是方法调用消息、结果返回消息、错误消息、信号消息。
这里的信号消息是主动发送的事件,如新设备插入、文件更改的事件等。
消息的一个重要的特点是消息的调用时异步的,也就是说,一个消息被调用了,但是并不能马上得到结果。
2.2.3 DBUS名字空间和地址
因为多个程序可以连接到同一条总线上,而一个程序又可能提供多个消息发送的对象,所以,必须采取一种有效的、无二义的命名方式,给同一总线上的不同对象命名,就像每一个街道地址都可以唯一确定一栋房子一样。
在这里,我们使用的方式是,用三个元素来唯一确定不同总线上的不同对象。
这三个元素是:Service、Object name、Interface[22]。
(1)Services
一个service代表总线上一个应用程序的连接。
其实,这里的service就对应于DBUS规格文档中的bus name。
但是,bus name 这个术语有点混淆,因为从名字上来看,我们不知道它到底代表的是总线名,还是总线上一个连接的名字。
实际上,bus name指的是总线上一个连接的名字。
所以,在这里我们用service来代替bus name。
通常,我们把一个组织的域名反过来,作为一个service的名字。
很多由KDE 提供的服务它们的服务名就是以org.kde为前缀的。
比如,你可以在系统中看到“org.kde.screensaver”的服务名等等。
因此,我们应该使用自己的域名来命名服务名。
比如说,如果你的域名是“”,你的应用程序的名字是game,那么你就应该用“com.qq.game”作为你在DBUS总线上的服务名。
如果你的程序有两个以上的总线连接,那么你可以在服务名上加上进程ID号。
(2)Objects
对象是一个独立的处理消息的实体。
对象有一个或多个接口,在每个接口有一
个或多个的方法,每个方法实现了具体的消息处理。
在一对一的通讯中,对象通过
一个连接直接和另一个客户端应用程序连接起来。
在多对多的通讯中,对象通过一
个连接和DBUS后台进程连接起来。
对象有一个路径用于指明该对象的存放位置,
消息传递时通过该路径找到该对象。
一个应用程序在总线上可以有多个Object。
服务与对象这种多对一的关系是
通过对象路径来解决的。
也就是说,每一条对象路径代表服务中的一个不同对象。
比如/MianInterface或者/Document/Doc1。
在实际的应用的,路径名是一个决定路径,并且路径名的命名方式和它所在服务有关。
通常,路径名的命名方式和服务
的命名方式类似,比如由KDE提供的服务的路径名一般都是/org/kde/ screensaver
等等。
对象给Interface提供了入口,实际上,一个对象可以同时提供多个Interface。
(3)Interface
接口是一系列可调用的方法(Methods)和信号(Singals)的集合。
一个接口中可
以定义多个方法和信号。
接口的命名方式和路径的命名方式类似,比如服务名为“org.kde.screensaver”,对象名/org/kde/screensaver的一个接口的名字很有可能是“org.kde.screensaver.interface”。
(4)整合
一个DBUS消息包含的地址信息就是由上述的三个部分和方法名或者信号名组成。
只有包含了这些信息,一个消息才能被正确的路由到接收消息的应用程序。
比
如说一个消息可能是这样:org.luodan.test /org/luodan/test org.luodan.test.interface.testMethod。
在这个例子中“org.luodan.test”为服务名,
/org/luodan/test为对象,org.luodan.test.interface为接口,testMethod为方法。
通过这
种方式,每一个可能目的地址都是唯一的、可靠的。
图2.2是用D-Feet工具调式DBUS
看到的有关DBUS总线的信息。
我在LuoDan.c的文件中建立一个上面例子中的方法testMothod,在D-Feet调式界面中可以看到testMothod方法。
图2.2 D-Feet工具调试DBUS示意图
2.3 桌面总线的用例
尽管 DBUS 相对较新,但是却迅速地得到了采用。
如前所述,可以构建具有DBUS 支持的 udev 以使得当热插拔(hot-plug)设备时它可以发送一个信号。
任何应用程序都可以侦听这些事件并当接收到这些事件时执行动作。
例如,gnome-volume-manager 可以检测到 USB 存储棒的插入并自动挂载它;或者,当插入一个数码相机时它可以自动下载照片[23]。
一个更为有趣但很不实用的例子是 Jamboree 和 Ringaling 的结合。
Jamboree 是一个简单的音乐播放器,它具有 DBUS 接口,以使得它可以被告知播放、到下一首歌、改变音量等等。
Ringaling 是一个小程序,它打开 /dev/ttyS0(一个串行端口)并观察接收到的内容。
当 Ringaling 发现文本“RING”时,就通过 DBUS 告知 Jamboree 减小音量。
最终的结果是,如果您的计算机上插入了一个调制解调器,
而且电话铃响,则音乐音量就会为您减小。
这正是计算机所追求的!
2.4 本章小结
本章主要介绍了DBUS的相关知识。
首先,本章叙述了DBUS的定义和DBUS 的结构,接着讲述了DBUS总线的分类,然后重点阐述了DBUS消息以及DBUS的名字空间和地址,最后讨论了DBUS的特性和实际用例。
3 Coral体系结构的设计
基于DBUS的嵌入式系统应用程序接口建立在框架的概念上,它拥有框架的基本特点。
框架是整个或部分系统的可重用设计,它强调软件设计的重用性和系统的可扩充性,目的在于缩短大型应用软件系统的开发周期,提高开发质量。
本文提出的Coral就是一种建立在嵌入式系统上可重用性高、可扩展性强、开发效率高的嵌入式应用程序接口。
3.1 层次架构
传统嵌入式系统的软件和Coral都是一种分层架构[24]。
Coral是以传统嵌入式系统软件层次结构为基础,对其进行细分和改进。
3.1.1 分层设计
分层设计是分而治之的思想的应用[25]。
它把整体分成多个部分,但各个部分之间的地位并不是等同的,而是某种上下级的关系。
分层系统的结构如图3.1所示。
图3.1 分层系统结构图
分层设计是最古老的设计方法之一,也是最有用的设计方法之一。
基于分层的架构具有如下的优点[26]。
(1)降低系统的复杂度。
由于每层都是相对独立的,层与层之间通过定义良好接口家落户,每层都可以单独实现,从而降低了系统的复杂度。
(2)隔离变化。
我们知道软件的变化通常发生在最上层和最下层。
最上层是图形用户界面,需求的变化通常直接影响用户界面,大部分软件的新老版本在用户界。