分类号 密 级
UDC
代 号 10701
学 号 编 号
太原科技大学
硕士学位论文
题 目:
嵌入式Linux实时系统的研究与设计
英文题目:Embedded Real-time Linux System Research and Design
学位申请人姓名:
指导教师姓名
:
太原科技大学
学位论文独创性(或创新性)声明
秉承学校严谨的学分和优良的科学道德,本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中不包含其他人已经发表或撰写过的研究成果;也不包含为获得西安电子科技大学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中做了明确的说明并表示了谢意。
申请学位论文与资料若有不实之处,本人承担一切的法律责任。
本人签名: 日期
太原电子科技大学
关于论文使用授权的说明
本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究生在校攻读学位期间论文工作的知识产权单位属西安电子科技大学。学校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部或部分内容,可以允许采用影印、缩印或其它复制手段保存论文。同时本人保证,毕业后结合学位论文研究课题再攥写的文章一律署名单位为西安电子科技大学。
(保密的论文在解密后遵守此规定)
本学位论文属于保密,在 年解密后适用本授权书。
本人签名: 日期
导师签名: 日期
摘要
关键词:
Abstract
Keyword:
目录
第一章绪论
1
.1课题研究的目的和意义
随着移动计算环境的发展,数据库系统也从集中式、分布式发展到今天的嵌入式数据库系统。与通用的桌面系统不同,由于嵌入式系统没有充足的内存和磁盘资源(或者没有磁盘),因此,不论是嵌入式的操作系统还是数据库管理系统,都要占用最小的内存和磁盘空间。若采用大型的商用数据库管理系统,则不可避免的占用大量的内存和磁盘空间,同时会产生大量的冗余数据;因此,它不能应用于嵌入式系统的数据管理川。长期以来,商业数据库行业都在不停的追逐高性能的事务处理以及复杂的查询处理能力,并制定了相应的行业标准。但是对嵌入式数据库系统来说,嵌入式应用系统之间差别很大,因此它们对嵌入式数据库系统的要求较高,这主要表现在:易于维护、高度可靠性和小巧性[(Z1易于维护性是指用户能够在嵌入式设备上正确的完成任务,而不必进行复杂的人工干预;用户除了在处理速度上具有一定的要求而外,他们需要相信存储在设备上的数据具有高度可靠性;小巧性主要是基于嵌入式系统的内存和磁盘资源提出的.嵌入式数据库主要是管理存放在SRAM. ROM 或FLASH ROM 中的数据。嵌入式系统内存较小,CPU 速度慢,因此,在嵌入式数据库系统中数据的结构和算法以及数据查询处理算法非常关键,必须采用合适的策略和特殊的数据结构、算法才能满足用户的需求。
1.2
国内外研究现状
目前,嵌入式数据库技术已经成为一个十分活跃的研究领域,并引起了越来越广泛的关注。以下列出了嵌入式数据库系统的几个主要研究方向和国内外一些重要研究成果:
(1)
数据复制(一致性)
采用移动计算模型的嵌入式数据库系统与传统的数据库系统是不一样的,嵌入式数据库的一个显著特点是移动终端之间以及与服务器之间的连接是一种弱连接,即低带宽、长延迟、不稳定和经常性的断开,而为了能在这种环境下对数据库进行更新操作,嵌入式系统必须提供数据复制与同步功能,使得嵌入式数据库系统可以随时随地从其它数据库系统获得准确的、最新的、有用的、一致的数据。现在普遍采用乐观复制方法,允许用户对本地缓存上的数据副本进行操作,待网络重新连接后再与数据库服务器或其他终端交换数据修改信息,并通过冲突检测和协调来恢复数据的一致性。国内外的一些大学、科研机构和著名的数据库厂商己经在嵌入式数据库系统的数据复制与同步领域进行了大量的研究工作,并取得了一定的成果。迄今为止,人们己经提出了多种复制算法,如两级复制算法(two-tierreplication algorithm )、虚拟主副本方法(virtual primary copy method)、多版本冲突消解方法(multiversion reconciliation algorithm),三级复制机制(three tierreplication)和主动复制机制等等,这些算法对我们以后的研究工作有重要意义,但它们也存在着一些缺点,如事务在服务器上重做开销较大、不能完全保证可串行性、仅适用于特定环境等,因此嵌入式数据库复制系统还有很多课题有待研究。
(2)
移动事务处理
移动事务是指从移动机上发起的数据操作集合,移动事务具有天然的断接性,一个操作集合可能分成几个连接才能完成,不能用传统的事务模型。而且由于网络带宽有限,甚至网络经常处于断接状态,局部复制的数据难以和主数据版本保持严格一致,使得移动事务具有弱一致性需求。另外移动事务还有移动机位置不固定,执行时间长,更易出错的传统事务模型没有考虑的特征,所以有必要研究新的事务模型来解决。有很多大学对嵌入式数据库技术、移动事务处理等技术进行了大量的研究,如移动数据库加锁机制,移动事务管理机制等等。Rutge大学、Monash大学、Pittsburgh大学、Washington大学等等也对移动事务处理、位置相关数据的处理等进行了大量研究,同时也提出了很多种模型,主要有Pitoura和Bhargava提出一个构建在分布式数据库系统之上的Clustering模型,Gray提出的一个与Clustering模型类似的两级复制模型,它们都实现了在移动环境下保持数据库弱一致性的方案,并能较好的支持断接操作,但它们资源开销过大,而且没有考虑事务的移动性,对长事务也不支持。Walbom和Chrysanthi提出的Pro-motion模型,它的优点是在于灵活的支持断接,引入了应用语义来提高自治性和并发性,同时还支持长事务,但是它是一个基于面向对象数据库系统进行设计的事务模型,传统的关系数据库很难实现,并且它对移动性的支持也非常有限。
(3)
数据的安全性
许多应用领域的嵌入式设备是系统中数据管理或处理的关键设备,因此嵌入式设备上的数据库系统对存取权限的控制较严格。同时,由于无线连接的网络远没有固定网络安全,因为无论从何地都可以轻而易举监测和发射无线电波,而且很难被发现,所以数据无线传输比固定线路传输更容易受到盗用和欺骗。其次,嵌入式设备携带方便,很容易失窃,如何避免嵌入式设备失窃后对接受和发送数据的盗用以及如何防止碰撞、磁场干扰等问题对个人数据安全的威胁等等问题都是数据安全需要考虑的问题。保证数据安全的主要措施是:第一,对移动终端进行认证,防止非法终端的欺骗性接入;第二,对无线通信进行加密,防止数据信息泄漏;第三,对下载的数据副本加密存储,以防移动终端物理丢失后的数据泄密。
(4)
实时性要求
嵌入式数据库的很多应用对数据库和实时处理两者的功能均有需求,既需要数据库来支持大量数据的共享,维护数据的一致性,又需要实时处理来支持起任务(事务)与数据的定时限制。而传统的数据库管理系统不能满足这种实时性应用的需要,因此产生了将数据库与实时系统相结合的实时数据库系统(RTDBS )。因为这种实时数据库技术经常被应用在嵌入式数据库中,因此实时数据库技术也是嵌入式数据库研究的一个重要方向。目前国内外对RTDBS的研究非常关注,1982年Bell实验室研制成功了第一个专用实时数据库管理系统Zip-RTDBMS,现在己有许多成功的实验系统,有的已商品化。国内研究起步于80年代末,目前己有成功的实验系统,例如国防科技大学计算机系研制的KMMDB、华中科技大学计算机学院研制的ARTS-I等,但尚未形成正式产品。
(5)
数据广播
通俗地讲,是指在移动计算环境中,利用客户机与服务器通讯的不对称性,以广播的形式向客户机发送数据。其中最大的优点是广播开销不依赖移动用户的数量变化而变化。借助数据广播,一定程度下可以解决嵌入式数据库的断接性。MARYLAND大学和MITL实验室的M.Franklin和S.A charya等人应用“广播磁盘”进行数据广播,将磁盘划分为多个速率容量不等的小磁盘井按照一定的策略调度进行广播,还对广播协议和更新策略进行了研究。K.St athato等人采用了“空中Cache”的方法,将数据按“温度”划分成三级。“温度”随着访问次数的增加而升高,“温度”越高的数据在Cache中存放的时间越长,广播的频率越高。在国内,国防科技大学周兴铭院士主持的研究组对这方面进行了大量的研究工作,他们对数据广播进行了深入的研究,提出了启发式多盘调度算法。其工作主要集中在对传统复制技术的改进以适应于嵌入式数据库的需求。
(6) XML
嵌入式数据库
XML
嵌入式数据库是可以对XML文档进行存取管理和数据查询的嵌入式数据库,是一个能够在应用中管理XML数据和文档的数据库系统。注意,XML本身并不是数据库,仅仅意味着XML文档。XML数据库不仅是结构化数据和半结构化数据的存储库,持久XML数据管理还包括数据的独立性、基成型、访问权限、视图、完备性、冗余性、一致性以及数据恢复等。DXML嵌入式数据库是XML技术和嵌入式数据库技术结合的产物,它们的结合体现了一种趋势,目的就是如何使数据更通用,能被异构系统、任何应用都接受。目前,主要的数据库厂商在他们的嵌入式数据库产品中都提供了对XML的支持,开发出了大量的XML文档和嵌入式数据库之间数据转换的工具,但由于XML数据进出嵌入式数据库的转换方法不同,所以各公司的解决办法也不尽相同。而且值得注意的是,虽然现代嵌入式数据库大多支持XML,但它们的支持是有限的,使应用程序不能很好地复用:各数据库均缺乏对XML查询语言XQuery的支持,各数据库均不能保证在数据转换时不产生语义的损失等等。对这一领域的研究才刚刚起步,还有许多挑战性的问题有待更深入研究。
1.3
本文的研究目标和研究内容
目标是在研究现有嵌入式数据库的基础上设计和实现一个具有如下特征的嵌入式数据库:
1)
零配置,自包含,即不需要安装,不依赖外部组件;
2)
实现部分的SQL92标准;
3)
数据库完整存储在磁盘文件中;
4)
提供简单明了的API;
本文的研究内容主要包括以下几方面:
1)S QL
命令处理器
包括词法分析、语法分析的原理,单词种类的区分,语法规则的定义等,另外本文详细的介绍了语法生成工具Lemon;
2)
代码生成器
按模块分析针对不同的SQL语句系统的流程图,不同的模块对应的函数以及每一个函数的输入参数,输出结果等,此外,在此章节中还详细分析了B_树索引的查询、插入、删除的原理。
3)
虚拟机
也就是详细分析了中间代码的具体实现过程,在此详细的解释了每一个中间代码的具体含义和执行过程。
1.4
论文的内容安排
第一章 主要介绍嵌入式数据库系统研究的意义、国内外的研究现状现状以及本文研究的主要内容。
第二章 对嵌入式系统和嵌入式数据库进行介绍,简单介绍了嵌入式系统处理器,嵌入式操作系统等内容,并对嵌入式数据库系统的特点以及当前存在的主要数据库系统进行了介绍。
第三章 详细介绍了SQL编译器是如何实现的,从编译的原理上对词法分析、语法分析部分进行了详细的说明,并对语法生成器Lemmon进行了说明;
第四章 总体介绍嵌入式数据库系统的主要功能、系统体系结构、关键数据机构和函数以及在内存中的存储形式等。
第五章 按模块逐一介绍了每个模块的执行流程,使数据库的执行过程更加直观,最后设计了一套完整的虚拟机代码并说明了每个代码的具体操作过程。
第六章 简单对现有系统进行了分析,指出系统的特色与不足,并提出系统有待改进需要进一步完善之处。
第七章 总结与展望
第二章 嵌入式系统库综述
2.1
嵌入式系统的定义
嵌入式系统(Embedded System)是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。
2.2
嵌入式系统的特点
嵌入式系统通常包括构成软件的基本运行环境的硬件和操作系统两部分。嵌入式系统的运行环境和应用场合决定了嵌入式系统具有区别于其它操作系统的一些特点。
(1)嵌入式处理器
嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP(Digital Signal Processor)。嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相关的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式处理器主要包括:PowerPC、Motorola 68000、ARM系列等等。
嵌入式微控制器又称为单片机,它将CPU、存储器(少量的RAM、ROM或两者都有)和其它外设封装在同一片集成电路里。常见的有8051。嵌入式DSP专门用来对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在数字滤波、FFT、谱分析、图像处理的分析等领域,DSP正在大量进入嵌入式市场。 (2)微内核结构
大多数操作系统至少被划分为内核层和应用层两个层次。内核只提供基本的功能,如建立和管理进程、提供文件系统、管理设备等,这些功能以系统调用方式提供给用户。一些桌面操作系统,如Windows、Linux等,将许多功能引入内核,操作系统的内核变得越来越大。内核变大使得占用的资源增多,剪裁起来很麻烦。
大多数嵌入式操作系统采用了微内核结构,内核只提供基本的功能,比如:任务的调度、任务之间的通信与同步、内存管理、时钟管理等。其它的应用组件,比如网络功能、文件系统、GUI系统等均工作在用户态,以系统进程或函数调用的方式工作。因而系统都是可裁减的,用户可以根据自己的需要选用相应的组件。
(3)任务调度
在嵌入式系统中,任务即线程。大多数的嵌入式操作系统支持多任务。多任务运行的实现实际是靠CPU在多个任务之间切换、调度。每个任务都有其优先级,不同的任务优先级可能相同也可能不同。任务的调度有三种方式:可抢占式调度、不可抢占式调度和时间片轮转调度。不可抢占式调度是指,一个任务一旦获得CPU就独占CPU运行,除非由于某种原因,它决定放弃CPU的使用权;可抢占式调度是基于任务优先级的,当前正在运行的任务可以随时让位给优先级更高的处于就绪态的其它任务;当两个或两个以上任务有同样的优先级,不同任务轮转地使用CPU,直到系统分配的CPU时间片用完,这就是时间片轮转调度。
目前,大多数嵌入式操作系统对不同优先级的任务采用基于优先级的抢占式调度法,对相同优先级的任务则采用时间片轮转调度法。
(4)硬实时和软实时
有些嵌入式系统对时间的要求较高,称之为实时系统。有两种类型的实时系统:硬实时系统和软实时系统。软实时系统并不要求限定某一任务必须在一定的时间内完成,只要求各任务运行得越快越好;硬实时系统对系统响应时间有严格要求,一旦系统响应时间不能满足,就可能会引起系统崩溃或致命的错误,一般在工业控制中应用较多。
(5)内存管理
针对有内存管理单元(MMU)的处理器设计的一些桌面操作系统,如Windows、Linux,使用了虚拟存储器的概念。虚拟内存地址被送到MMU。在这里,虚拟地址被映射为物理地址,实际存储器被分割为相同大小的页面,采用分页的方式载入进程。一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的部分页面装入内存运行。
大多数嵌入式系统针对没有MMU的处理器设计,不能使用处理器的虚拟内存管理技术,采用的是实存储器管理策略。因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址;而且,大多数嵌入式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入主存储器的连续空间。
由此可见,嵌入式系统的开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存;在开发应用程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外,由于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常;因而,嵌入式系统的开发人员对软件中的一些内存操作要格外小心。
(6)内核加载方式
嵌入式操作系统内核可以在Flash上直接运行,也可以加载到内存中运行。Flash的运行方式,是把内核的可执行映像烧写到Flash上,系统启动时从Flash的某个地址开始执行。这种方法实际上是很多嵌入式系统所采用的方法。内核加载方式是把内核的压缩文件存放在Flash上,系统启动时读取压缩文件在内存里解压,然后开始执行。这种方式相对复杂一些,但是运行速度可能更快,因为RAM的存取速率要比Flash高。
由于嵌入式系统的内存管理机制,嵌入式操作系统对用户程序采用静态链接的形式。在嵌入式系统中,应用程序和操作系统内核代码编译、链接生成一个二进制影像文件来运行。
2.3
嵌入式系统相关技术
相对于在Windows环境下的开发应用程序,嵌入式系统开发有着很多的不同。不同的硬件平台和操作系统带来了许多附加的开发复杂性。
2.3.1
嵌入式开发过程
在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接、定址过程的计算机;目标机指运行嵌入式软件的硬件平台。首先须把应用程序转换成可以在目标机上运行的二进制代码。这一过程包含三个步骤:编译、链接、定址。编译过程由交叉编译器实现。所谓交叉编译器就是运行在一个计算机平台上并为另一个平台产生代码的编译器。常用的交叉编译器有GNU C/C++(gcc)。编译过程产生的所有目标文件被链接成一个目标文件,称为链接过程。定址过程会把物理存储器地址指定给目标文件的每个相对偏移处。该过程生成的文件就是可以在嵌入式平台上执行的二进制文件。
嵌入式开发过程中另一个重要的步骤是调试目标机上的应用程序。嵌入式调试采用交叉调试器,一般采用宿主机-目标机的调试方式,它们之间由串行口线或以太网或BDM线相连。交叉调试有任务级、源码级和汇编级的调试,调试时需将宿主机上的应用程序和操作系统内核下载到目标机的RAM中或直接烧录到目标机的ROM中。目标监控器是调试器对目标机上运行的应用程序进行控制的代理(Debugger Agent),事先被固化在目标机的Flash、ROM中,在目标机上电后自动启动,并等待宿主机方调试器发来的命令,配合调试器完成应用程序的下载、运行和基本的调试功能,将调试信息返回给宿主机。
2.3.2
向嵌入式平台移植软件
大部分嵌入式开发人员选用的软件开发模式是先在PC机上编写软件,再进行软件的移植工作。在PC机上编写软件时,要注意软件的可移植性,选用具有较高移植性的编程语言(如C语言),尽量少调用操作系统函数,注意屏蔽不同硬件平台带来的字节顺序、字节对齐等问题。以下是我们在移植协议栈过程中的一些体会。
(1)
字节顺序
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。
(2)
字节对齐
有的嵌入式处理器的寻址方式决定了在内存中占2字节的int16、uint16等类型数据只能存放在偶数内存地址处,占4字节的int32 、uint32 等类型数据只能存放在4的整数倍的内存地址处;占8字节的类型数据只能存放在8的整数倍的内存地址处;而在内存中只占1字节的类型数据可以存放在任意地址处。由于这些限制,在这些平台上编程时有很大的不同。首先,结构体成员之间会有空洞,其次,若对内存中数据以强制类型转换的方式读取,字节对齐的不同会引起数据读取的错误。因为假如指针指在基数内存地址处,我们想取得占内存两个字节的数据存放在uint16型的变量中,强制类型转换的结果是取得了该指针所指地址与前一地址处的数据,并没有按照我们的愿望取该指针所指地址与后一地址处的数据,这样就导致了数据读取的错误。
解决字节对齐有许多方法,比如可以在GCC的项目管理文件MakeFile中增加编译选项--pack-struct;但这种方法只能去除结构中的空洞,并不能解决强制类型转换引起的错误。为了增强软件的可移植性以及和同类其它平台产品的互通性,我们在收数据包处增加了拆包的函数,发数据包处增加了组包的函数。这两个函数解决了字节序的问题,也解决了字节对齐的问题。即组包时根据参数中的格式字符串将内存中的不同数据类型的某段数据放在指定地址处,组成包发给下层;拆包时,根据参数中的格式字符串将收到的内存中的数据存放在不同类型的变量或结构成员中。在函数中针对不同的数据类型作不同的处理。
(3)
位 段
由于位段的空间分配方向因硬件平台的不同而不同,对X86平台,位段是从右向左分配的;而一些嵌入式平台,位段是从左向右分配的。分配顺序的不同导致了数据存取的错误。解决这一问题的一种方法是采用条件编译的方式,针对不同的平台定义顺序不同的位段;也可以在前面所述的两个函数中加上对位段的处理。
(4)
代码优化
嵌入式系统对应用软件的质量要求更高,因而在嵌入式开发中尤其须注意对代码进行优化,尽可能地提高代码的效率,减少代码的大小。虽然现代C和C++编译器都提供了一定程度的代码优化,但大部分由编译器执行的优化技术仅涉及执行速度和代码大小的平衡,不可能使程序既快又小,因而必须在编写嵌入式软件时采取必要的措施。
2.4
嵌入式系统的应用
嵌入式系统的应用前景是非常广泛的,人们将会无时无处不接触到嵌入式产品,从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等等。特别是以蓝牙为代表的小范围无线接入协议的出现,使嵌入式无线电的概念悄然兴起。当嵌入式的无线电芯片的价格可被接受时,它的应用可能会无所不在。在家中、办公室、公共场所,人们可能会使用数十片甚至更多这样的嵌入式无线电芯片,将一些电子信息设备甚至电气设备构成无线网络;在车上、旅途中,人们利用这样的嵌入式无线电芯片可以实现远程办公、远程遥控,真正实现把网络随身携带。下面介绍几种具体的应用。
(1)嵌入式移动数据库
所谓的移动数据库是支持移动计算的数据库,有两层含义:① 用户在移动的过程中可以联机访问数据库资源。② 用户可以带着数据库移动。典型的应用场合有在开着的救护车上查询最近的医院。该系统由前台移动终端、后台同步服务器组成,移动终端上有嵌入式实时操作系统和嵌入式数据库。中国人民大学正在开发该系统,他们和Hopen公司合作,开发了前台移动终端”小精灵”。
(2)嵌入式系统在智能家居网络中的应用
智能家居网络(E-Home)指在一个家居中建立一个通信网络,为家庭信息提供必要的通路;在家庭网络操作系统的控制下,通过相应的硬件和执行机构,实现对所有家庭网络上家电和设备的控制和监测。其网络结构的组成必然有家庭网关。家庭网关主要实现控制网络和信息网络的信号综合并与外界接口,以便作远程控制和信息交换。不论是网关还是各家电上的控制模块,都需有嵌入式操作系统。这些操作系统必须具有内嵌式、实时性好、多用户的特点。南京东大移动互联技术有限公司研制的智能多媒体家庭网关,就是以嵌入式Linux作为该嵌入式设备的操 作系统,设备之间的相互通信遵从蓝牙通信协议,可以支持多个设备同时接入到固定电话网、国际互联网等其它外部网络。
(3)嵌入式语音芯片
嵌入式语音芯片基于嵌入式操作系统,采用语音识别和语音合成、语音学层次结构体系和文本处理模型等技术;可以应用在手持设备、智能家电等多个领域,赋予这些设备人性化的交互方式和便利的使用方法;也可应用于玩具中,实现声控玩具、仿真宠物、与人对话的玩具;也能应用于车载通信设备实现人机交流。该芯片应用在移动通信设备中,比如,手机上短消息来时,我们不必费力地去看,而是可以听到声音。
(4)基于小范围无线通信协议的嵌入式产品
以蓝牙为代表的小范围无线接入协议与嵌入式系统的结合,必将推动嵌入式系统的广泛应用。近来,基于这些协议的嵌入式产品层出不穷,包括各种电话系统、无线公文包、各类数字电子设备以及在电子商务中的应用。这些产品以其微型化和低成本的特点为它们在家庭和办公室自动化、电子商务、工业控制、智能化建筑物和各种特殊场合的应用开辟了广阔的前景。
第三章 嵌入式操作系统
3.1
嵌入式操作系统的定义
嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等browser。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。
3.2
嵌入式操作系统的特点
嵌入式操作系统具有以下一些特点。
(1)体积小。嵌入式系统有别于一般的计算机处理系统,它不具备像硬盘那样大容量的存储介质,而大多使用闪存(Flash Memory)作为存储介质。这就要求嵌入式操作系统只能运行在有限的内存中,不能使用虚拟内存,中断的使用也受到限制。因此,嵌入式操作系统必须结构紧凑,体积微小。
(2)实时性。大多数嵌入式系统都是实时系统,而且多是强实时多任务系统,要求相应的嵌入式操作系统也必须是实时操作系统(RTOS)。实时操作系统作为操作系统的一个重要分支已成为研究的一个热点,主要探讨实时多任务调度算法和可调度性、死锁解除等问题。
(3)特殊的开发调试环境。提供完整的集成开发环境是每一个嵌入式系统开发人员所期待的。一个完整的嵌入式系统的集成开发环境一般需要提供的工具是编译/连接器、内核调试/跟踪器和集成图形界面开发平台。其中的集成图形界面开发平台包括编辑器、调试器、软件仿真器和监视器等。
3.3
嵌入式操作系统的发展状况及分类
国外嵌入式操作系统已经从简单走向成熟,主要有Vxwork、QNX、PalmOS、Windows CE等。国内的嵌入式操作系统研究开发有2种类型,一类是基于国外操作系统二次开发完成的,如海信的基于Windows CE的机顶盒系统;另一类是中国自主开发的嵌入式操作系统。
一般情况下,嵌入式操作系统可以分为两类,一类是面向控制、通信等领域的实时操作系统,另一类是面向消费电子产品的非实时操作系统,这类产品包括个人数字助理(pda)、移动电话、机顶盒、电子书、webphone等。
3.4
典型嵌入式操作系统介绍
1
. 嵌入式Linux
嵌入式Linux同Linux一样,具有低成本、多种硬件平台支持、优异的性能和良好的网络支持等优点。另外,为了更好地适应嵌入式领域的开发,嵌入式Linux还在Linux基础上做了部分改进,如下所示。
(1)
改善的内核结构
Linux
内核采用的是整体式结构(Monolithic),整个内核是一个单独的、非常大的程序,这样虽然能够使系统的各个部分直接沟通,提高系统响应速度,但与嵌入式系统存储容量小、资源有限的特点不相符合。因此,在嵌入式系统经常采用的是另一种称为微内核(Microkernel)的体系结构,即内核本身只提供一些最基本的操作系统功能,如任务调度、内存管理、中断处理等,而类似于文件系统和网络协议等附加功能则运行在用户空间中,并且可以根据实际需要进行取舍。这样就大大减小了内核的体积,便于维护和移植。
(2)
提高的系统实时性
由于现有的Linux是一个通用的操作系统,虽然它也采用了许多技术来加快系统的运行和响应速度,但从本质上来说并不是一个嵌入式实时操作系统。因此,利用Linux作为底层操作系统,在其上进行实时化改造,从而构建出一个具有实时处理能力的嵌入式系统,如RT-Linux已经成功地应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像处理等各种领域。
UC/OS-II
的前身是UC/OS,最早出自于1992年美国嵌入式系统专家Jean J.Labrosse在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把UC/OS的源码发布在该杂志的BBS上。当时就有500多人下载了这份源码。世界上数以千计的工程技术人员将UC/OS应用到了各个领域,如照相机业、发动机控制、网络接入设备、高速公路电话系统、ATM机和工业机器人等。许多大学用UC/OS作教材,用于实时系统教学。
UC/OS
和UC/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。许多移植的范例可以从网站上得到。用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将UC/OS嵌入到开发的产品中。
UC/OS
具有执行效率高、占用空间小、实时性能优良和可扩展性能等特点,最小内核可编译至2KB。UC/OS-II已经移植到了几乎所有知名的CPU上。
eCos(embedded Configurable operating system)
,即嵌入式可配置操作系统,最初起源于美国的Cygnus Solutions公司。Cygnus公司于1998年11月发布了第一个eCos版本eCos1.1,当时只支持有限的几种处理器结构。1999年11月,RedHat公司以6.74亿美元收购了Cygnus公司。在此后的几年里,eCos成为其嵌入式领域的关键产品,得到了迅速的发展。2002年,RedHat公司由于财务方面的原因,裁剪了eCos开发队伍,但并没有停止eCos的发展。RedHat公司随后宣称将继续支持eCos的发展,而由原eCos主要开发人员组建了eCos Centric公司,并于2003年5月正式发布了eCos2.0。
虽然eCos是RedHat的产品,但是eCos并不是Linux或Linux的派生,eCos弥补了Linux在嵌入式应用领域的不足。目前,一个最小配置的Linux内核大概有500KB,需要占用1.5MB的内存空间,这还不包括应用程序和其它所需的服务;eCos可以提供实时嵌入式应用所需的基本运行基件,而只占用几十KB或几百KB的内存空间。eCos是一个源码开放的可配置、可移植、无版税、面向深嵌入式应用的实时操作系统。从eCos的名称可以看出,它最大的特点在于它是一个配置灵活的系统。ECOS的核心部分是由不同的组件组成的,包括内核、C语言库和底层运行包等。每个组件以能提供大量的可配置选项,利用eCos提供的配置工具可以很方便地进行配置。通过不同的配置使得eCos能够满足不同的嵌入式应用。
VxWorks
操作系统是美国WindRiver 公司于1983 年设计开发的一种嵌入式实时操作系统(RTOS)。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛应用在通信、军事、航空和航天等等高精尖技术和实时性要求极高的领域中,如卫星通信、军事演习、弹道制导、飞机导航等。在美国的F-16、FA-18 战斗机、B-2 隐形轰炸机、和爱国者导弹上都是用到了VxWorks。
VxWorks
是由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks 内核最小为8kB,即便加上其它必要模块,所占用的空间也很小,其不失实时、多任务的系统特征。由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。一个实时系统内核需满足实时环境所提出的基本要求,这些包括:多任务,抢占调度,任务间的通讯与同步,任务与中断之间的通信。
Nucleus PLUS
是为实时嵌入式应用而设计的一个抢先式多任务操作系统内核,其95%的代码是用ANSIC写成的,因此非常便于移植并能够支持大多数类型的处理器。从实现角度来看,Nucleus PLUS 是一组C函数库,应用程序代码与核心函数库连接在一起,生成一个目标代码,下载到目标板的RAM中或直接烧录到目标板的ROM中执行。在典型的目标环境中,Nucleus PLUS 核心代码区一般不超过20K字节大小。Nucleus PLUS 采用了软件组件的方法。每个组件具有单一而明确的目的,通常由几个C及汇编语言模块构成,提供清晰的外部接口,对组件的引用就是通过这些接口完成的。除了少数一些特殊情况外,不允许从外部对组件内的全局进行访问。由于采用了软件组件的方法,Nucleus PLUS 各个组件非常易于替换和复用。Nucleus PLUS 的组件包括任务控制、内存管理、任务间通信、任务的同步与互斥、中断管理、定时器及I/O驱动等。
4.1
嵌入式数据库定义
数据库技术总是与计算环境的一定发展阶段相适应,新的计算环境和需求促成数据库技术的形成和发展。计算环境从集中式、分布式、网络环境到日前深受瞩目的移动计算环境MCE(Mobile Computing Environment)和普遍化计算环境PCE (Pervasive Computing Environment)等多种计算环境。在分布计算的基础L,计算环境进一步扩展包含为各种移动设备、具有无线通信能力的服务网络,构成了移动计算环境。随着移动计算环境发展,数据库系统也从集中式、分布式、B/A/S多层结构数据库系统发展到今天的嵌入式数据库系统。当前采用标准的关系数据库和数据同步/复制技术,嵌入式数据库管理系统己经成为数据库领域的新焦点。
与通用的桌面系统不同,由于嵌入式系统没有充足的内存和磁盘资源(或者没有磁盘),所以,不论是嵌入式的操作系统还是数据库管理系统,都要占用最小的内存和磁盘空间。如果采用文件系统或大型关系型数据库管理系统,都不可避免地产生大量的冗余数据、数据管理效率低下等问题,所以,它们不能应用于嵌入式系统地数据管理。而长期依赖,商业数据库行业都在不停的追逐高性能的事务处理能力以及复杂的查询处理能力,并制定相应的行业标准。但是对于嵌入式数据库系统来说,不通的嵌入式应用系统其自身的特点不一样,对于不同的系统一般只要求完成简单的数据查询和更新,但是随着移动计算技术。对于它性能的度量标准:易于维护、强壮性、小巧性.在现有的各个嵌入式数据库系统之间难以进行确切地比较,在这三个标准中,易于维护和健壮性是关键,用户除了在处理速度上的要求外,它们需要相信存储在设备的数据具有高度可靠性。易于维护性能够让他们的嵌入式设备正确的完成任务,而不必进行复杂的人工干预。反过来,这两个特点也就促成了嵌入式系统的另外一个特征,小巧性的形成。嵌入式数据库系统可以支持移动用户在多种网络条件下有效地访问所需数据,完成数据查询和事务处理:通过数据库的同步技术或者数据广播技术,即使在断接的情况下用户也可以继续访问所需数据,这使得嵌入式数据库系统具有高度的可用性;它还可以充分利用无线网络固有的广播能力,以较低的代价同时支持多移动用户对后台主数据源的访问,从而实现高度的可伸缩性,这是传统的客户服务器或分布式数据库系统所难以比拟的。
同时,在嵌入式系统里,我们采用得最多的是利用实时操作系统来实现系统的配置和快速的运行,如果在操作系统之上使用数据库管理系统,那么,数据库必须同样具备良好的实时性能,这样才能保证与操作系统结合后,不会影响整个系统的实时性能。嵌入式数据库主要是管理存放在SRAM、ROM或Flash ROM 中的系统和用户数据。因为系统和用户的数据一般都在SRAM、ROM或Flash ROM中,但由于系统内存小和CPU速度慢,因此,在嵌入式数据库系统中数据的结构和算法以及数据查询处理算法非常关键,必需采用特殊的数据结构、算法及相关的数据库精简技术。
4.2
嵌入式数据库的特点
在现实世界中,有许多应用包含了对数据的“定时”存取和对“短暂有效”数据的存取。例如电话交换、电力或数据网络管理、空中交通管制、雷达跟踪、工厂生产过程控制和CIMS,证券交易等等。这些应用一方面需要维护大量共享数据和控制知识,另一方面其应用活动有很强的时间性,要求在一个确定的时刻或一定的时间期限内,从外部环境采集数据、按彼此间的联系存取并对数据进行处理,再及时做出相应。同时,它们所处理的数据往往是“短暂”的,即只在一定的时间范围有效,过时则无意义了,所以这种应用同时需要数据库技术和实时数据处理技术。
因此,实时数据库就是其数据和事务都有显式的定时限制的数据库,系统的正确性不仅依赖于事务的逻辑结果,而且依赖于该逻辑产生的时间。近几年来,实时数据库系统已经发展为现代数据库研究的主要方向之一,受到了数据库界和实时系统界的极大关注。然而,实时数据库并非是数据库和实时系统两者的简单结合,它需要对一系列的概念、理论、技术、方法和机制进行研究开发,如数据模型及其语言,数据库的结构和组织;事务的模型与特性,尤其是截L时间及其软硬性:事务的优先级分派、调度和并发控制协议与算法:数据和事务特性的语义及其与一致性、正确性的关系;查询/事务处理算法与优化;I/O调度、恢复、通信的协议与算法等等。
传统数据库系统处理永久数据。事务存取这种数据,同时维护其完整性、一致性、所以传统的数据库具有ACID (Atomicity. Consistency, Isolation Durability)特征,即:
(1)
强调一致性、可恢复性和永久性;
(2)
事务之间没有合作(交互作用、通信);
(3)
进行不可预报的数据存取,其执行时间不可预测;
(4)
根本没有“时间维”,更不需要显式地考虑时间。
所以,原子性和可串行化是普遍所能接受地正确性、一致性标准。在实时数据库中,则有根本性的不同,实时数据库事务由以下特性决定:
(1)
可见性,事务执行时可以查看另外一个事务结果的能力;
(2)
正确性,事务本身的一致性及提交事务所产生的数据库状态的一致性;
(3)
可恢复性发生故障时使数据库成为某种被认为是正确状态的能力;
(4)
永久性事务记录其结果到数据库中的能力;
(5)
可预报性事务预测一个事务是否会满足其时限的能力。
这是由于在实时应用环境下:
(1)
传统的原子平淡事务模型己不完全适应,有的要求复杂事务,如多层、嵌套、分裂、合作事务等;
(2)
事务协调、合作而并发执行,故要求有较强的可见性;
(3)
在有些情况下,宁愿要一个部分不正确的信息也不愿意得到正确但过时的信息,即及时性比正确性更重要;
(4)
由于(1),(3)两点,对于传统数据库最重要的可串行化调度与并发控制不一定是必须的,而需要实时协议和时间正确的调度;
(5)
并非所有数据都具有永久性,有的是短暂的,甚至不一定要求所有的结果都记录到数掘库;
(6)
恢复不一定意味着数据库状态的完全恢复。
所以实时数据库与传统的数据库在概念、原理、结构、算法等方面都存在很大的差别,最根本的区别就在于数据与事务的定时限制,这里要指出的是,实时并发简单的意味着快,也不一定就是毫微秒或秒级的定时限制。快固然重要,但是对子实时数据库而言,实时指的是能施加和处理显式的定时限制,即使用实时协议来处理与各种活动相联的截止时间或定期限制。
从前面对嵌入式数据库的概述中已经可以看到,与大型数据库系统相比较,嵌入式数据库系统有其不同的特点。归纳起来,嵌入式数据库系统有如下主要特点:
(1)
占用存储空间小
嵌入式系统资源有限,有些甚至没有磁盘,系统的数据不象埂盘数据库系统(Disk Resident Database System,DRDB)的数据可以驻留在磁盘中,在一个DRDB中,系统的开销主要花费到I/O操作上,而在嵌入式系统中,数据大部分存储在内存中,因而在这种情况下嵌入式系统数据处理有着其自身的特点。
(2)
可靠性、可管理性和安全性
嵌入式系统通常在移动、相对封闭的环境下使用,信息技术支持人员无法对其提供现场技术支持。因此,嵌入式数据库系统必须可靠,而且能在无需人L管理的情况下运行。鉴于这一特点,对于嵌入式系统中使用的数据库来说,其自身的可靠性、可管理性和安全性显得特别重要。
(3)
互操作性和可移植性
一般嵌入式数据库系统都是能针对具体的开发平台和操作系统设计和实现的,但为了保证与其它的嵌入式式数据库或者大型企业数据库进行信息共享,数据库开发人员在开发系统的过程中应该能提供一定的机制实现与其他数据处理程序的互操作,以及相应的数据同步功能。同时嵌入式系统的应用领域非常广泛,所采用的操作系统等软件和硬件环境也千差万别,为了适应这种差异性,嵌入式数据库系统的移植性必须得到充分考虑。
嵌入式实时数据库系统是实时数据库技术在嵌入式系统中的一种应用,因此实时数据库需要满足嵌入式系统对有限资源的严格的要求,这使得实时数据库系统在软件结构有了很大的变化。在嵌入式系统中需要对实时数据库的软件模块进行剪裁、配置。实时数据库的软件模块通常以构件(组件)提交给系统此外,实时数据库软件需要具有较高的可靠性和实时性,这对资源有限的嵌入式系统而言是一个很大的挑战,即如何在有限的系统资源的基础上实现较高的可靠性和实时性。
4.3
主流的嵌入式数据库产品及其关键技术
尽管小型嵌入式数据库面临的难题比大型数据库要复杂的多。但是市场需求却是与日俱增,而且将是一个很大的开放市场。在将来,智能移动设备和其他各种装置的嵌入式数据库可以接受连续的数据流,以满足这些装置的应用需求,这是嵌入式数据库系统未来发展基本趋势的一个方面;另一方面,鉴于手持装置使用无线通信技术,这一技术对嵌入式数据库系统的未来发展将产生举足轻重的影响。因此,无线通信技术的不断发展和无线通信业务成本的降低,将是嵌入式数据库系统在未来发展中取得成功的关键因素。同时,制造商将进一步提高各种计算装置的数据处理和存储的能力,从而会使得嵌入式数据库的设计变得更加容易,而且在功能上将会得到新的拓展。
在这里对主流的嵌入式数据库产品做一个分类:
表 1 关系型嵌入式数据库产品
提供厂商
|
产品
|
特点
|
Empress
|
Empress RDBMS
|
运行在大多数的嵌入式操作系统上,支持SQL和可编程接口
|
Microsoft
|
MSDE
|
一个向上兼容微软SQL的数据库引擎。具有有限的并发处理能力。
|
Polyhedra
|
SQL Anywhere
|
支持SQL的客户端数据库引擎,运行在大多数的桌面、服务器和嵌入式系统平台
|
Solid
|
Solid Embedded
|
提供对大多数服务器、嵌入式系统的数据库管理功能,具有ODBC、JDBC接口。
|
表 2 面向对象型数据库
提供厂商
|
产品
|
特点
|
Objectivity
|
Objectivity DB
|
支持C++,Java,支持桌面和服务器操作系统,但是目前不支持嵌入式系统且处理模型较复杂。
|
Persistence
|
Power Tier
|
提供对大多数数据库的接口,支持Java Beans和C++。
|
POET Software
|
POET Object
|
提供C++和Java编程接口和对象一致性存储机制。
|
表 3 嵌入式链接库
提供厂商
|
产品
|
特点
|
Free Software Foundation
|
Gdbm
|
开放源代码提供对数据记录的简单api操作。不支持并发的读写访问控制。
|
Centura Software
|
RDM
,db.linux
|
开发源代码,RDM链接库和应用程序一同编译,支持主流的嵌入式操作系统。
|
Sleepycat Software
|
Berkeley DB
|
提供简单的可编程接口,可以按应用需求对数据库进行配置。运行在桌面、服务器和嵌入式操作系统上。
|
如表1,2,3所示,由于嵌入式设备提供服务功能的多样化,不同的嵌入式系统对嵌入式数据库的应用有不同的要求。这体现在:对高端用户群体而一言,嵌入式数据库系统需要较高的并发控制能力和可剪裁、可配置的事务处理能力。除此以外,嵌入式数据库系统还需要具有健壮性,需要具备快速的灾难恢复能力;对低端用户群体而言,可能并不需要并发用户和事务处理的功能,系统只需要具备较高的性能和快速的数据存储能力心
为了使嵌入式系统能更好地发挥其作用,主要涉及以下几种关键技术发展方向:
(1)
系统的高可靠性技术
嵌入式实时数据库系统通常需要在无人干预的条件下运行,因此对系统的高可靠性(High Reliability)提出了很高的要求。在嵌入式系统有限资源的条件下如何确保系统的可靠性,是目前研究的一个热点。
(2)
系统整体的微型化
存储空间的限制是目前制约嵌入式系统的主要因素。系统微型化是指提高数据存储空间利用率,其主要实现方法是对关系模式的优化和数据的压缩存储优化。并根据具体应用需求,选择系统必须组件功能,为此系统的微型化是以放弃系统功能完备性为代价的。
(3)
数据同步/复制技术
通常嵌入式系统数据库中的数据只是某个后台主数据库或者数据源的一个局部数据副本,多个移动用户共享同样的数据资源。为了达到嵌入式应用程序与基地信息的有机结合,需要向中心数据库上载数据以及下载数据。这种双向的信息共享主要是通过装载数据同步/复制技术的最重要的一项技术。
(4)
系统可定制能力
当数据系统和应用分离时,即使应用所需求的功能较少,但数据系统仍然包括了所有支持的功能模块,造成了资源的浪费,这对于资源有限的嵌入式系统来说时不合理的。系统可定制可以解决这个问题,它根据实际应用的需求定制数据库系统的功能,真正做到量体裁衣物尽其用。Sybase UltraLite提交技术便是这一技术的范例。
(5)
系统可移植性与多平台支持
嵌入式系统技术发展迅猛,应用领域广泛。但就从嵌入式操作系统的种类繁多、更新速度快、系统特点不一这一点来看,要适应这种广阔的应用空间,嵌入式数据库多平台支持成为一项十分重要的性能要求。嵌入式设备的迅速新使得系统具有良好的可移植性。
(6)
网络支持与数据安全
网络支持使得系统可以通过各种有线或者无线连接协议让多个移动终端具有进行数据共享、以及终端与后台主数据源进行数据交互的能力。特别是Web访问能力使系统具有在线和离线状态都可以进行数据处理。随着网络多终端的支持,系统数据的安全性也就成为一个重要的问题。使用数据备份和写保护存储技术可以达到数据包含,数据有效的安全访问策略可以保证系统数据安全。
4.4
嵌入式RTDBS的体系结构
随着嵌入式系统的广泛应用及嵌入式实时操作系统的不断普及,嵌入式环境下的数据管理问题成为系统中的重要环节,构建嵌入式实时数据库系统(RTDBS,Real Time Data Base System)成为嵌入式开发中必须解决的问题。这里所说的嵌入式RTDBS是指可在嵌入式设备中独立运行的一种数据库系统,用以处理大量的、时效性强且有严格时序的数据,它以高可靠性、高实时性和高信息吞吐量为目标,其数据的正确性不仅依赖于逻辑结果,而且依赖于逻辑结果产生的时间。图2是一个嵌入式应用的基本构架,整个嵌入式RTDBS建于实时操作系统之上。由于嵌入式实时数据库系统在运行环境和运行方式上与常见的企业级数据库管理系统有很大差别,因此,传统的企业数据库如Oracle、Sybase等在实时嵌入式环境下很难发挥作用,尤其在一些实时性要求很高的控制系统中,传统数据库更显得无能为力。因此,伴随着各种商用嵌入式实时操作系统的出现,研究嵌入式环境下的实时数据库系统成为嵌入式软件中的一项重要内容。
硬件平台(PowerPC,ARM)
|
嵌入式应用软件
|
嵌入式RTDB
|
实时OS
|
图2 嵌入式应用基本结构
|
目前嵌入式系统开发中,在实时数据库问题上的多数看法是,嵌入式RTDBS从本质上说是一个“内存数据库”,是一个由应用程序管理的内存缓冲池,它在系统中的作用就是一个供多个实时任务共同使用的共享数据区。这种数据库实际上是一个嵌入在用户应用软件中的与应用程序不可分割的部分,其功能主要是数据的存和取,不具有独立性,不是一个真正意义上的数据库系统。一个完整的嵌入式实时数据库系统除了包括内存数据库外,还应当含有历史数据库和数据库管理系统DBMS及提供给用户的接口函数,整个数据库可由DBMS完成对数据库的具体配置及各种操作,例如系统运行前根据实际需要对内存数据库中的记录节点进行增减等配置操作。目前的嵌入式实时数据库系统可分为两大类,一类是商用级的嵌入式实时数据库系统,它独立于具体的应用软件,如美国McObject公司提供的eXtremeDB内存式实时数据库,这是一种专门为嵌入式系统数据库管理而编写的实时数据库,它将数据库直接建立在内存之中,并根据应用特征产生数据库API,用户可方便的调用这些接口函数管理整个数据库系统;另一类是用户针对具体的应用对象而自行设计开发的嵌入式实时数据库系统,这种数据库一般是嵌入到应用软件中作为应用程序的一部分,不具有独立性,目前测控系统中用户开发的实时数据库大都属于这种情况。
图3 嵌入式RTDBS的体系结构
|
历史数据区
|
实时数据区
|
事务管理
|
嵌入式
应用软件
|
实时
事务处理
|
CPU管理
|
实时
事务调度
|
事务1
|
事务
缓冲池
|
事务n
|
事务2
|
事务
缓冲
|
缓冲
管理
|
硬实时调度
|
软实时调度
|
非实时调度
|
内存管理
|
磁盘管理
|
图3所示的是一个嵌入式实时数据库的体系结构,同传统的数据库一样,它仍然是一种三级模式的结构体系,即用户模式、逻辑模式和存储模式。在嵌入式环境下构建实时数据库系统,应该完成以下功能:高效的数据存取机制、数据安全性控制、实时事务管理机制、数据库的恢复机制等,设计中更关心的是系统的实时性、开销大小、系统性能、可靠性、可预知性和底层控制能力,即如何针对选用的实时OS和嵌入式硬件平台设计合理的数据模型和物理结构,重点放在如何高效的利用嵌入式系统的有限资源、如何提高数据的存取速度、如何进行数据保护、数据交换、查询/ 事务处理算法的优化、事务的优先级分派、事务调度和并发控制等。
4.5
嵌入式RTDBS的数据模型
嵌入式实时数据库系统的关键是数据模型的确立,它决定了数据被访问和操作的方式,应用程序的性能和可靠性也大部分取决于此。目前嵌入式环境下的数据库系统多数采用了关系模型结构,这也是商用数据库系统的数据模型,该模型结构是利用二维关系表来实现数据存储,利用索引访问和查询数据,这种模型结构是建立在严格的数学基础上的,结构简单灵活,独立性好,但在嵌入式环境下的内存开销和数据冗余较大,用户必须对其进行优化,增加了开发数据库系统的难度;有些嵌入式数据库则采用了网状模型结构,该模型通过指针来确定数据间的显式连接关系,它比关系模型中利用冗余数据和索引文件要节约大量的存储空间,具有一定的数据独立性和共享特性,运行效率较高,而且由于它避免了索引操作,比关系型数据库模式要节省存储空间,数据操作速度也更快。但是这种模型结构比较复杂,尤其当嵌入式系统规模增大时,其数据库的结构变得非常庞大,可能会影响到系统的实时性能。图4所示的是在相同数目的记录下,关系模型和网状模型的系统开销比较,从图中可以看出,网状模型因为避免了索引操作使得其开销要小于关系模型。但是在实际应用中,应当根据实时系统的综合性能选取数据库模型,通常可采用网状加关系或层次加关系的混合模型结构以弥补两种结构之间的缺陷,如CENTURA公司的嵌入式实时数据库RDM(Raima Database Management),它将网状和关系模型的优点结合起来,避免了不必要的索引开销,显著地减少系统存储空间、I/O操作和CPU周期,由于其快速而且可靠性高的特点,广泛应用于许多嵌入式产品中。
记录数(K字节)
|
3
|
6
|
9
|
12
|
图4 关系和网状模型开销比较
|
3N
|
2N
|
N
|
3T
|
2T
|
T
|
比例
|
存储空间比较
|
关系模型
|
网状模型
|
关系模型
|
网状模型
|
创建时间比较
|
0
|
4.6
嵌入式RTDBS的物理结构
在嵌入式实时系统中,确定性是一个重要的性能指标,用户必须能够确定数据操作的时间和数据库存储空间的占用情况等。传统的数据库的存储管理主要是基于磁盘存储结构,数据在存取过程中需要进行频繁的I/O操作,由于I/O操作时间的不确定性,使得传统数据库存储技术无法应用在嵌入式系统中。考虑到存取时间、存储空间利用率和维护代价等因素,通常嵌入式实时系统的存储结构分为两个层次,第一层为内存,即RTDBS中的内存数据库,整个实时数据库系统的高性能要求就是以内存数据库作为底层支持的,它是实时数据库系统的关键,用于程序运行和实时数据的处理,它存取速度快,无需进行磁盘的I/O操作,因此最适合用于实时数据的管理和操作;第二层为外存,通常采用一些永久存储设备,需要进行读写I/O操作,用于存储系统中的历史数据。这样,对于那些固定不变的数据(如模拟量的工程单位)或存取频率相对较低的数据(如只有在故障恢复时才使用的数据备份或日志备份)放在外存空间内,而把所有的实时数据或当前工作部分的数据驻留在内存中,避免了数据库文件的操作,大大提升了实时数据库系统的性能。对于这种两层存储结构中的内存部分,可由嵌入式OS自动分配,用户也可指定系统的分配空间,一般由三部分共享内存构成,分别是索引区、数据区和系统信息区,每条记录由表名、段号、段内偏移地址来确定。
嵌入式RTDBS中数据的查找及更新相当频繁,必须建立良好的索引结构以加速各种操作的执行速度和确保数据结构的紧凑性。嵌入式RTDBS由于实时数据全部驻留内存,系统很少进行磁盘I/O操作,因此其索引结构重点解决时间和空间上的开销,其建立原则是快速定位,节省空间。通常采用的数据库索引结构为顺序结构、B树、AVL树的方法。顺序结构可采用数组方式存储,其优点是存取方便,但不便于动态维护,进行插入删除等操作时需要移动大量的数据; B树的使用最为广泛,它操作性能好,动态维护方便,但是它的每个节点的数据覆盖率仅为55%,存储效率太低;AVL树具有较高的存取性能,但是每个节点需要两个指针域和一些附加的控制信息,存储效率也不高。它们均不是嵌入式实时环境下的最佳选择,因此在以上结构的基础上,出现了多种改进的适用于嵌入式数据库系统的索引结构,如针对提高内存数据库性能的T*树索引结构,这是一种改进的T树结构,它比AVL树和B树具有更高的空间利用率,虽然查找时间复杂度稍高于AVL树,但内存中的操作使得其查找时间足以满足实时性要求,这种结构大大减少了节点间元素的移动和平衡处理的次数,较好的考虑了时间和空间的关系,是一种适用于嵌入式系统的索引结构;此外,针对嵌入式系统I/O操作性能的不平衡B树索引结构,主要为了减少存储块的写次数,这种索引结构的节点由若干个关键字和指针域构成,每个指针指向具有相应关键字的文件记录,由于不平衡B树避免了B树为了调节平衡产生的进一步分裂而进行的次数,因此提高了系统的写性能。
4.7
嵌入式RTDB的运行过程和开发过程
4.7.1
运行过程
ERTDB(Embedded Real Time Data Base )
的运行过程是一个在数据库引擎总控模块的控制下进行的有序协调的过程。ERTDB的运行过程分为5个步骤。
(1)
数据库系统初始化
ERTDB
的初始化调用API的初始化函数启动,初始化数据库系统的全局控制结构,取数据库的运行状态信息,分配数据库内存空间,ERTDB系统初始化时还将对全局资源--ERTDB字典表进行确认。
(2)
打开或创建字典表
在数据库系统第一次启动时,即数据库第一次被装入时,该字典表是不存在的,在这里初始化时将创建字典表,为后续操作做准备。在数据库系统以后的启动过程中,该字典表己经存在,数据库系统初始化时将确认字典表是否已存在。此时若检查到字典表不存在,将重新打开一个字典表。
(3)
数据库具体操作
ERDTB
系统及其具体的字典表操作初始化后就可以在数据库操作引擎控制下调用数据存取模块或数据库维护模块对数据库进行各种操作了。对基本表的主要操作有:创建基本表、插入记录、删除记录、修改记录、查找、排序、备份和恢复以及碎片整理等,我们将在第四章对重要功能的操作流程和实现进行详细介绍。
(4)
关闭字典表
关闭字典表后可以释放己分配的输出缓冲区空间、结果集结构空间、控制头结构、列定义信息等内部结构变量空间,并可以释放该字典表占用的类信息结构。
(5)
关闭数据库系统
通过调用 API的关闭函数实现。主要工作是关闭数据库,释放ERTBD系统申请的全局结构变量空间即DB结构,释放分配给RTDB的空间。
实际运行过程中,数据库系统初始化后,若字典表创建成功或己存在的条件下,可对字典表进行多次的打开操作和关闭操作。
4.7.2
开发过程
ERTBD
的开发过程是按照软件工程的思想来组织实施的。开发过程依次经历了原型阶段,需求分析阶段,概要设计阶段,详细设计阶段,编码阶段,测试阶段,以及维护阶段。
在原型阶段,主要是在台式机上围绕着RTBD的一些基本功能,如表创建,记录的插入、删除、修改等操作,在PC机上予以实现,以获得对将要开发的系统的一个初步的认识。实际开发的原型是在Linux环境下实现的。
在需求分析阶段,主要是根据用户的要求,进一步细化系统应该具有的功能和性能要求,和用户达成一致,并为下一步的系统概要设计打好基础。
在概要设计阶段,基本上确定了系统的体系结构,确定了系统向用户所提供的API接口,确定了系统各个组成模块之间的关系,确定了系统的一些核心数据结构。
在详细设计阶段,主要是设计各个模块具体函数的伪代码或流程图实现。
在编码阶段,主要工作就是编码并调试,以实现系统预定的功能。
在测试阶段,测试工作非常重要,除了在系统开发的各个阶段都贯穿了一些测试的内容外,还专门安排了一个比较长时间的测试阶段。测试阶段包含了功能测试,健壮性测试,性能测试等多个测试环节,经过测试阶段,系统的质量和稳定性都得到了比较大的提高。
4.8
小结
本章主要从ERTDB的外部特性着手,介绍了当今主流的嵌入式数据库产品,并从ERTDB特点出发,分析了ERTDB的实时性、特点和主要解决的问题,以及它的体系结构、数据模型和物理结构,最后概要地阐述了ERTDB的运行过程和开发过程。
第五章 系统开发平台综述
5.1
硬件平台的搭建
5.1.1 A
RM
开发平台介绍
ARM
微处理器是一种高性能、低功耗的32位微处器,它被广泛应用于嵌入式系统中,ARM是一家英国公司,它的文字含义是Advanced RISC Microprocessor(高级RISC微处理器)。ARM为客户提供16/32位嵌入式RISC微控制器方案,将其RISC处理器授权给电子公司使用,在便携式通讯,手持计算设备,消费类和数字化多媒体方案中,ARM正有一种成为标准的趋势。
ARM7
、ARM9是ARM系列中的两个分支系列,ARM9功能更强些,它还有其他分支系列。ARM公司是一个只做设计不生产的公司,它提供各种不同性能的ARM核,如果象Motorola这样的公司就可以用它提供的ARM核,再加上相关的I/O资源、存储器、可编程部件就形成自己的32位RISC嵌入式单片处理器。
5.1.2 A
RM9
的特点
ARM9
主要特点如下:(1)32bit定点RISC处理器,改进型ARM/Thumb代码交织,增强性乘法器设计。支持实时(real-time)调试;(2)片内指令和数据SRAM,而且指令和数据的存储器容量可调;(3)片内指令和数据高速缓冲器(cache)容量从4K字节到1M字节;(4)设置保护单元(protcction unit),非常适合嵌入式应用中对存储器进行分段和保护;(5)采用AMBA AHB总线接口,为外设提供统一的地址和数据总线;(6)支持外部协处理器,指令和数据总线有简单的握手信令支持;(7)支持标准基本逻辑单元扫描测试方法学,而且支持BIST(built-in-self-test);(8)支持嵌入式跟踪宏单元,支持实时跟踪指令和数据。
5.1.3 S3C2410
开发板介绍
三星(Samsung)S3C2410是一款著名的移动设备处理器产品,最著名的应用应该是在惠普的iPAQ系列PDA上,S3C2410有两个型号: S3C2410X 和 S3C2410A,A型是X型的改进型,相对来说具有更好的性能和更低的功耗,s3c2410主要面向手持式设备以及高性价比、低功耗的应用,现在市面上许多高性能的PDA、手机、数码相机、机顶盒等均采用s3c2410为处理器。
S3c2410
对于片内的各个部件采用了独立的电源供给方式,在时钟方面S3C2410X也有突出的特点,该芯片集成了一个具有日历功能的RTC和具有PLL(MPLL和UPLL)的芯片时钟发生器。MPLL产生主时钟,能够使处理器工作频率最高达到203MHz。这个工作频率能够使处理器轻松运行Windows CE、LINUX等操作系统以及进行较为复杂的信息处理。
5.2
嵌入式Linux开发环境的建立
5.2.1
嵌入式Linux开发环境的基本结构
由于嵌入式设备没有足够的内存以及存储资源来完成其编译过程,所以就在主机上完成针对目标的代码编译生成,这个过程称为交叉编译。这也是目前大多数嵌入式设备开发所使用的编译方式。为了提高嵌入式Linux的开放效率,一个完善的嵌入式Linux开发环境是必不可少的。嵌入式Linux开发环境一般由如下几部分构成:Linux服务器(宿主机)、工作站、嵌入式目标系统和将它们连接在一起的网络环境,其具体结构如图所示。
嵌入式目标系统
|
工作站n
|
Linux服务器
|
网络
|
工作站1
|
工作站2
|
图中所示的嵌入式Linux开发环境中,Linux服务器作为嵌入式Linux内核编译、应用程序编译的公共平台,由单独的一台PC机充当,安装常用的桌面标准Linux操作系统,如RedhatLinux等。
工作站即为普通的局域网计算机,可以是一台或多台,以支持小组项目开发。工作站一般安装常用的windows操作系统,仍然可以完成各种日常工作。当需要使用Linux服务器资源时,就从工作站远程登录到Linux服务器,以完成各项需要的操作。
工作 站作为开发人员的操作终端,可能需要经常登录Linux服务器和工作站之间进行文件的传输,因此,一般需要在工作站上安装FT,客户端程序(如Cuteftp等)和Telnet客户端程序(如SecureCRT等)。当Linux服务器的FTP服务和Telnet服务运行时,开发人员就可以方便地在工作站和Linux服务器之间进行文件传输,并可以通过Telnet方式登录到Linux服务器,并对其进行相关操作。
5.2.2
在Linux服务器上安装交叉编译工具
1.
获取交叉编译工具
开发基于 Linux的应用程序,一般的步骤是先编写程序代源码,然后编译调试,最终生成可执行程序。
目前,已有各种基于x86架构的GUN开发工具集,如C编译器G++编译器、G++连接器、调试器等,这些工具一般都作为标准Linux的一部分存在。但使用这些工具编译出来的可执行程序只能在基于x86架构的CPU上运行,因为编译器最终编译出来的是基于x86架构的机器码。
为使编译出的可执行代码能在诸如ARM或其他体系架构的CPU上运行,必须一个编译工具,这个工具应该能运行在基于x86架构的Linux服务器上,但通过它编译生成的可执行代码能够支持在其他体系结构的CPU上运行,这样的一个编译工具就叫交叉编译工具。交叉编译工具一般由专门的机构负责维护,可以从他们的网站上免费取得。
2.
安装交叉编译工具
下载的交叉编译工具以压缩的方式存在,需要将其安装到Linux服务器上。这里把交叉编译工具安装在Linux服务器的/usr/local/目录下,执行如下操作,建立/usr/local/arm目录,并将下载的交叉编译工具复制到该目录下:
#cd / usr /local (
进入目录/usr/local)
# mkdir arm (
建立子文件夹)
# cp /home/work/cross-2.953.tar.bz2
(拷贝文件)
输入如下命令解压安装编译工具:
#tar zxvf cross-2.95.3.tar.bz2 (
解压缩文件)
当以上命令执行完毕以后,会生成/usr/local/arm/2.95.3子目录,表明交叉编译器已经成功安装到了/usr/local/arm下。安装后会在该目录下生成如下的文件和目录:
ar m-Linux bin include info lib man share test-if-write
其中,bin目录下是交叉编译器和一些工具,如编译器amt-Linux-gcc是C交叉编译器,arm-Linux-g++是C++编译器,arm-Linux-as是汇编器,arm-Linux-ld是链接器。Lib目录下存放的是库文件,包括gcc库、lib-gcc库、lib-g++库等。
/include
目录存放编译器的头文件,包含了标准C的头文件、Linux的头文件、特定处理器相关的Linux头文件等。
在以上的工具中,arm-Linux-gcc作为基于ARM架构的C编译器,在系统开发过程中是最为常用的。
5.2.3
嵌入式Linux内核的配置与编译
如前文所述,Linux之所以能成为一种流行的嵌入式操作系统,除具有功能强大、高性能、稳定性好以及源代码开放等优势以外,其最大的特点是Linux内核具有非常良好的结构,可由用户根据特定的系统需求,对内核进行配置或裁剪,而这一特点恰恰满足了嵌入式应用的差异性需求。
Linux
操作系统除了基本内核以外,还集成了丰富的设备驱动程序,这些程序从广义上看包含了设备驱动、文件系统、协议栈等。如果每一个系统都全部包含这些源代码,那么编译以后的内核将是一个比较庞大的文件,这样显然不能满足不同的嵌入式应用需求。因此,如何合理地配置Linux内核,使之能够在功能和大小之间取得一个优化的结果,是嵌入式应用的一个重要问题,下面将结合本系统的实际操作来说明如何裁剪、编译一个Linux内核。
1.
获 取 Linux内核源代码
Linux
内核由专门的机构维护,可以从Linux内核的官方发布网站:http://www kemel.org上获取功能完善的最新内核。
目前, 各个芯片生产商在推出特定的嵌入式微处理器时,生产商或者第三方合作伙伴都会针对自己的微处理器发布荃于Linux的内核补丁,同时,国内外的开发系统生产商也会做相关的工作。因此,适合于特定嵌入式系统的Linux内核源代码可以从芯片生产商或开发系统生产商获得。本文所使用得内核版本为Linux-2.4.21, 友善之臂公司已为该版本得内核写好了针对S3C2410的补丁,因此,加上这个补丁的Linux-2.4.21内核就是一个适合运行在荃于ARM9处理器上的版本。
2. Linux
内核配与编译
Linux
内核的配置(或裁剪)或与嵌入式系统的应用需求相适应的。尽管Linux内核功能强大,支持的设备众多,但对于一个特定的嵌入式应用来说,可能只会使用到其中的部分功能,而对于其他不使用的部分。如果让它驻留在系统中,不但耗费系统资源,同时还会增加系统的安全隐患。因此,内核配置的目的,就是保留系统需要的功能,去掉不必要的部分,使操作系统以最精简、最优化的状态运行。
本系统的Linux内核编译步骤如下:
1)
整理出系统需要支持的硬件、文件系统类型以及网络协议等内容,以便配置内核时选择所需的软件支持。
2)
下载并解压Linux内核,本系统从htp:// www.kemel.org/pub/Linux/kemel/下载内核,因为安装系统时所安装的源代码默认情况下支持很多设备,这样给内核裁减降低了难度。一般都将Linux内核源代码放在/usr/src下。
3)
清除从前编译内核时残留的文件和不必要的关联:
cd /usr/src/Linux
(进入文件夹)
make mrproper
(清除不必要的关联)
确保源代码目录下没有不正确的文件和文件依赖关系,执行该命令后,内核选项会回到默认的状态下。本系统是下载的内核源码,而且是第一次编译,所以就不必执行这一步操作。
4)
配置内核,修改相关参数
本系统需要选择的模块有:
Support for paging of anonymous memory( swap) //
支持虚拟内存
Enable loadable module support(CONFIG MODULES) //
动态装载模块功能
Networking support(CONFIG NET) //
网络支持
TCP/ IP networking //TCP/IP
协议
等系统必须的功能模块。
5)
运行make clean, 清理一些不必要的文件,如果在上次编译的基础上,删去了一些选项就必须执行这一步操作。
6)
编译内核
编译内核的命令是:make zImage
这一步是实际的编译过程,最终会生成可运行在嵌入式系统上的内核映像文件。执行完成这一步后,会在arch/am/boot下生成一个内核映像文件zImage。但是,对于一个实际的嵌入式应用系统来说,仅包含Linux内核是不够的,还必须有文件系统的支持。在嵌入式Linux内核启动后,需要加载根文件系统,以支持系统与用户交互。
5.2.4
根文件系统的制作
每一台运行Linux操作系统的计算机都有根文件系统,嵌入式设备也不例外。对于PC来说,根文件系统一般在本地磁盘中,而对于嵌入式系统来说,则一般以RAMDISK或其他形式存在。在Linux操作系统中,根文件系统包含系统引导文件和使其他文件系统得以挂载所必需的文件。在嵌入式Linux中,可以作为根文件系统的设备有很多,如在RAM中虚拟的文件系统RAMDISK,FLASH上的只读文件系统Romfs,可以通过网络加载到本机的网络文件系统NFS,还有在FLASH上实现的可读写文件系统JFFS等,都可以作为文件系统被加载。
对于嵌入式Linux来说,最简单、最常用的根文件系统是RAMDISK。RAM DISK就是指使用系统的一部分内存空间来模拟一个用户熟悉的磁盘分区,用户在RAMDISK上进行的所有操作都与传统的磁盘文件操作一样。因此,在内存性价比越来越高的今天,对于无盘系统或嵌入式系统,选择RAMDISK作为根文件系统是很适合的。在实际的应用过程中,通常采用的方式是从开发系统提供商获得一个已经做好的RAMDISK然后由用户根据自身系统的实际需求,对己有的RAMDISK进行增减,最终形成一个适合自身应用的RAMDISK。
1. RAMDIK
的制作
1)
首先为根文件系统创建空的文件镜像:
mkdir /mnt initrd //
创建目录
dd if=/dev/zero of=initrd.img bs=1k count=8192 //
确定文件系统大小
mkfs.ext 2 –F initrd.img //
制作文件系统
moun t –o loop in itrd.img/mnt/initrd //
挂载
上面命令创建了一个8192KB的文件系统镜像,并通过dev/zero进行初始化。
2)
创建目录,上面的命令创建了一个RAMDISK,要用必要的文件填充它:
mkdir dev proc etc sbin bin lib mnt usr
。
2.
利用已有的RAMDISK
本系统的RAMDISK是这样做的:
解压系统提供商的RAMDISK:gzip –d ramdisk.gz,将文件挂载到一个临时目录:
#mkdir ram_disk
#mount –o loop ramdisk ram_disk
#1s
根据本系统的需求,对相关文件进行增减操作,即可以往目录复制或删除一些文件,比如将BOA和SQLite加入其中。操作好后对新的RAMDISK文件进行压缩:
#umount /ramdisk //
卸载
#gzip ramdisk //
压缩文件系统
这样生成一个新的RAMDISK。有了嵌入式Linux和根文件系统,一个完整的嵌入式Linux系统就编译完成了。
5.2.5
网络文件系统(NFS)及配置
首先在Linux服务器上设置:以Root身份登录Linux服务器,编辑共享目录配置文件export,指定共享目录及权限等。执行如下的命令编辑文件:etc/exports
#vi /etc/exports (
编辑exports的内容)
在该文件中添加如下内容:
/home/work 192.168.1* (rw,sync,no_roots quash)
添加的内容表示IP在192.168.1.*的计算机以读写的权限来访问/home/work目录。
/home/work
也称为服务器输出共享目录。
接着执行如下命令,启动端口映射:
#/etc/rc.d/init.d/protmap start
最后执行如下命令启动NFS服务,此时NFS会激活守护进程,然后就开始监听客户端的请求:
#/etc /rc.d/init.d/nfs start
在NFS服务启动后还要检查Linux服务器的防火墙等设置,确保没有屏蔽掉NFS使用的端口和允许通信的主机。
首先在L inux服务器上进行NFS服务器的回环测试,验证共享目录是否能够被访问。在嵌入式系统上运行如下命令:
#mount-t nfs 192.168.1.1: /home/work/mnt
命令将Linux服务器的NFS输出共享目录挂载到/mat目录下,因此,如果NFS工作正常,应该能够在/mnt目录中看到/home/work共享目录中的内容。
在Linux服务器设里好以后,接下来需要进行客户端的设置。
首先需要运行在嵌入式目标系统的Linux内核支持NFS客户端,在嵌入式目标系统的Linux shell下,执行如下命令进行NFS共享目录挂载:
#/mkdir /mnt/nfs
#/mount -o nolock –t nfs 192.168.1.1
: /home/work/ mnt/nfs
#cd/ mnt/nfs
#ls
此时,嵌入式目标系统端所显示的内容即为Linux服务器的输出目录内容,即Linux服务器的输出目录/home/work通过NFS映射到了嵌入式目标系统的/mnt/nfs目录。可以用增删和修改文件的方式来验证实际效果。经过设置NFS,有两种调试嵌入式板上程序的方式,一是把嵌入式板上的文件挂载到Linux服务器下进行修改,第二是在Linux服务器上编写和修改程序,再通过网络联接和FTP把文件下载到嵌入式板上。
5.2.6 BOOTLOADER
本系统的引导程序不需要特别制作,使用自带的vivi即可。
5.3
软件开发平台的搭建
5.3.1
Qt
简介
Qt
是一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。
自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,KDE是所有主要的Linux发行版的一个标准组件。
5.3.2
基于PC平台的QT开发环境搭建
首先对源代码进行解压缩:
cd /usr/local
gunzip qt-x11-version.tar.gz #
对这个包进行解压速
tar xf qt-x11-version.tar #
对这个包进行解包
这样就会创建一个包含主要的包中文件的/usr/local/qt-version目录。接着把qt-version重新命名为qt(或者建立一个链接):
mv qt-version qt
这里假设Qt要被安装到/usr/local/qt路径下。
在主目录下的.profile文件(或者.login文件,取决于你的shell)中设置一些环境变量。如果它们并不存在的话,就创建它们。
QTDIR --
你安装Qt的路径
PATH --
用来定位moc程序和其它Qt工具
MANPATH --
访问Qt man格式帮助文档的路径
LD_LIBRARY_PATH --
共享Qt库的路径
在.profile文件(如果你的shell是bash、ksh、zsh或者sh)中,添加下面这些行:
QTDIR=/usr/local/qt
PATH=$QTDIR/bin:$PATH
MANPATH=$QTDIR/man:$MANPATH
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QTDIR PATH MANPATH LD_LIBRARY_PATH
在.login文件(如果你的shell是csh或者tcsh的情况下),添加下面这些行:
setenv QTDIR /usr/local/qt
setenv PATH $QTDIR/bin:$PATH
setenv MANPATH $QTDIR/man:$MANPATH
setenv LD_LIBRARY_PATH $QTDIR/lib:$LD_LIBRARY_PATH
做完这些之后,需要重新登录,或者在继续工作之前重新指定你的配置文件,这样至少$QTDIR被设置了。否则的话安装程序就会给出一个错误信息并且不再进行下去了。
编译Qt库,并且连编实例程序、教程和工具(比如Qt设计器), 输入:
./configure
make
这样的话就为PC机的Qt库配置完成。
5.3.2
基于嵌入式ARM平台的QT开发环境搭建
Qt/Embedded
是Qt的嵌入式版本,它在原始Qt的基础上,做了许多出色的调整以适合嵌入式环境。同Qt/X11相比, Qt/Embedded很节省内存,因为它不需要X server或是Xlib库,它在底层摒弃了Xlib,采用framebuffer作为底层图形接口。Qt/Embedded的应用程序可以直接写内核帧缓冲,因此它在嵌入式linux系统上的应用非常广泛。
在Linux下编译QT/E的过程如下:
tar xfz qt-embedded-2.3.4-commercial.tar.gz
cd qt-2.3.4
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
./configure -qconfig qpe -qvfb -depths 4,8,16,32
make sub-src
cd ..
也可以在configure的参数中添加-system-jpeg和gif,使Qtopia平台能支持jpeg、gif格式的图形。
5.4 SQLITE
5.4.1
SQLITE
介绍
SQLite
是一个小型的面向嵌入式系统的数据库,实现了独立的,可嵌入的,零配置的SQL数据库引擎,编译完成只有200K,同时支持2T的数据记录,对于嵌入式设备是一个很好的数据库引擎。特性包括:
**
事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。
**
零配置——不需要安装和管理。
**
实现了绝大多数SQL92标准。 (不支持的特性)
**
整个数据库存储在一个单一的文件中。
**
数据库文件可以在不同字节序的机器之间自由地共享。
**
支持最大可达2T的数据库。 (241 字节)
**
字符串和BLOB类型的大小最大可达 2G 字节(231字节)。
**
小的代码: 完整配置的少于250KB,忽略一些可选特性的少于150KB。
**
在大多数常见操作上比流行的客户/服务器数据库引擎更快。
**
简单,易于使用的API。
**
内建TCL绑定。另外提供可用于许多其他语言的绑定。
**
具有良好注释的源代码,95%经过测试。
**
独立:没有外部依赖。
**
源代码位于公共域。 可用于任何用途。
5.4.2 SQLITE
的体系结构
Block Diagram Of SQLite
|
Interface
|
SQL Command Processor
|
Viatual Machine
|
Tokenizer
|
Parser
|
Code Generator
|
B-Tree
|
Pager
|
OS Interface
|
Utilities
|
Test Code
|
图 SQLITE结构图
1.
接口程序
SQLite
类库大部分的公共接口程序是由main.c,legacy.c和vdbeapi.c源文件中的功能执行的。但有些程序是分散在其他文件夹的,因为在其他文件夹里他们可以访问有文件作用域的数据结构。sqlite3_get_table() 这个程序是在table.c中执行的。sqlite3_mprintf()在printf.c中执行。sqlite3_complete()在tokenize.c中执行。Tcl接口程序用tclsqlite.c来执行。
为了避免和其它软件在名字上有冲突,SQLite类库中所有的外部符号都是以sqlite3为前缀来命名的。这些被用来做外部使用的符号(换句话说,这些符号用来形成SQLite的API)是以sqlite3_来命名的。
2
.Tokenizer和Parser
当执行一个包含SQL语句的字符串时,接口程序要把这个字符串传递给tokenizer。Tokenizer的任务是把原有字符串分成一个个标示符,并把这些标示符传递给剖析器。
在这个设计中需要注意的一点是,tokenizer调用parser。熟悉YACC和BISON的人们也许会习惯于用parser调用 tokenizer。The author of SQLite的作者已经尝试了这两种方法,并发现用tokenizer调用parser会使程序运行的更顺利。
The parser
是一个部分,它基于文件场景赋予tokens意思。SQLite的parser是由 Lemon LALR(1) parser generator产生的。Lemon和YACC/BISON一样做同样的工作,但是它使用不同的输入语句,这个输入语句是不易出错的。Lemon也产生一个parser,这个parser是可重入的并且是线程安全的。Lemon定义了无终端解除程序的概念,所以当遇到语法错误的时候,它不会泄露内存。驱动Lemon的原文件在parse.y。
3
.代码发生器
在剖析器收集完符号并把之转换成完全的SQL语句时,它调用代码产生器来产生虚拟的机器代码,这些机器代码将按照SQL语句的要求来工作。在代码产生器中有许多文件。expr.c 处理表达式代码的生成。 where.c 处理SELECT, UPDATE and DELETE语句中WHERE子句的代码的生成。文件 attach.c, delete.c, insert.c, select.c, trigger.c update.c,和vacuum.c处理SQL语句中具有同样名字的语句的代码的生成。(每个文件调用expr.c and where.c中的程序)All other 所有SQL的其它语句的代码是由build.c生成的。文件auth.c执行sqlite3_set_authorizer()的功能。
4
.虚拟机器
由代码生成器产生的程序由虚拟机器来运行。总而言之,虚拟机器主要用来执行一个为操作数据库而设计的抽象的计算引擎。机器有一个用来存储中间数据的存储栈。每个指令包含一个操作代码和三个额外的操作数。
虚拟机器本身是被包含在一个单独的文件vdbe.c中的。虚拟机器也有它自己的标题文件:vdbe.h它在虚拟机器和剩下的SQLite类库之间定义了一个接口程序,vdbeInt.h 它定义了虚拟机器的结构。文件vdbeaux.c包含了虚拟机器所使用的实用程序和一些被其它类库用来建立VM程序的接口程序模块。文件vdbeapi.c 包含虚拟机器的外部接口。单独的值(字符串,整数,浮动点数值,BLOBS)被存储在一个叫 "Mem"的内部目标程序里,"Mem"是由vdbemem.c执行的。
SQLite
使用C语言程序来来执行SQL函数。即使内置的SQL函数也是用这种方法来执行的。
5
.B-树
SQLite
数据库在磁盘里维护,使用源文件btree.c中的B-树执行。数据库中的每个表格和目录使用一个单独的B-tree。所有的 B-trees 被存储在同样的磁盘文件里。文件格式的细节被记录在btree.c开头的备注里。B-tree子系统的接口程序被标题文件btree.h所定义。
6
.页面高速缓存和OS接口程序
B-tree
模块要求信息来源于磁盘上固定规模的程序块,默认程序块的大小是1024个字节,但是可以在512和65536个字节间变化。页面高速缓存负责读,写和高速缓存这些程序块。页面高速缓存还提供重新运算和提交抽象命令,它还管理关闭数据库文件夹。 B-tree驱动器要求页面高速缓存器中的特别的页,当它想修改页或重新运行改变的时候,它会通报页面高速缓存。为了保证所有的需求被快速,安全和有效的处理,页面高速缓存处理所有的微小的细节。
运行页面高速缓存的代码在专门的C源文件pager.c中。页面高速缓存的子系统的接口程序被目标文件pager.h所定义。
为了在POSIX和Win32 之间提供一些可移植性,SQLite操作系统的接口程序使用一个提取层。 OS提取层的接口程序被定义在os.h. 每个支持的操作系统有它自己的执行文件: Unix使用os_unix.c,windows使用os_win.c。
5.4.2QLITE
的移植
5.4.3 SQLITE
的安装
首先下载sqlite,可以到http://www.sqlite.org/download.html,下载sqlite软件包,完后将下载的软件包解压缩到uClinux-dist/user目录下;
命令为:
$tar zxvf sqlite-2.8.16.tar.gz -C uClinux-dist/user/
在同级目录下建立一个子目录:
mkdir bld
cd bld
../sqlite/configure
make
make install
make doc
make test
5.4.4
.SQLITE的移植
要将SQLite3.3.6移植到ARM2410开发板上,除了要有底层操作系统的支持外,还必须要有相应的交叉编译工具链。由于ARM2410开发板采用的是ARM-Linux作为底层操作系统,因此需要首先安装ARM-Linux工具链。
1
.交叉编译环境建立:
拷贝cross-2.95.3.tar.bz2到/usr/local目录下并解压缩。
cp cross-2.95.3.tar.bz2 /usr/local/arm
tar –jxvf cross-2.95.3.tar.bz2
2
.编译SQLite-3.3.6
(1)在/root下建立目录sqlite,拷贝sqlite-3.3.6.tar.gz到该目录同时解压缩。
tar –zxvf sqlite-3.3.6.tar.gz
(2)新建目录:
cd /sqlite-3.3.6
mkdir build
(3)修改配置文件
vi configure
进入目录build:
cd build
../ configure --disable-tcl --host=arm-linux
这样在build目录中就将生成Makefile和一个libtool脚本
(4)修改Makefile文件:
cd build
vi Makefile
将下面的这行
BCC = arm-linux-gcc -g -O2
改成:
BCC = gcc -g -O2
将下面的这行:
sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.la sqlite3.h
改成:
sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.a sqlite3.h
因为是将sqlite放到arm-linux的硬件板子上运行,所以我们一般将其编译成静态链接的形式。
保存Makefile文件后退出。
(5)编译:
执行make命令即可完成编译。
编译完成后,在build目录下生成许多.o和.lo文件。但最重要的时文件sqlite3。
file sqlite3
sqlite3: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
由此可知,此时生成的sqlite文件是还未strip过的。执行命令arm-linux-strip, 去掉其中的调试信息,这样文件将减少很多。
arm-linux-strip sqlite3
再次用file命令查看sqlite3的信息:
file sqlite3
sqlite3: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped
这就是在开发板上可以直接运行的可执行文件。
通过nfs将这些文件下载到开发板上。
需要注意:
拷贝是需要加上 –arf选项,因为libsqlite3.so,libsqlite3.so.0是链接到libsqlite3.so.0.8.6的。
cp –arf libsqlite3.so libsqlite3.so.0. libsqlite3.so.0.8.6 /usr/lib
cp sqlite3 /mnt/nfs
第六章 基于SQLITE的嵌入式数据采集系统的设计与实现
6.1
引言
数据采集是许多智能仪器仪表和工业测控系统的重要组成部分,传统的数据采集系统大多通过文件系统进行数据存储。文件存储的不足是存储效率低,安全性能差和并发性能不佳。因此,为解决以上问题,本系统使用嵌入式数据库SQLite取代文件系统进行数据存储和管理。经试验证明新系统无论在采集效率上还是系统稳定性上都比传统系统有了很大的提升。
传统的数据库是引擎驱动,SQLite则是程序驱动,其是零配置的,没有独立的数据库引擎,用户请求和数据服务在同一个进程中进行,避免了频繁的进程间通信的额外消耗。因此,它非常适合本系统对数据访问频繁,实时性高的要求。
6.2
应用程序整体设计
本系统大体可分为4个模块,分别是数据采集模块,数据监视模块,数据缓冲模块和数据传输模块。
现对该4个模块详细说明如下:
1.
数据采集模块
数据采集过程主要通过8通道10位数据转换器来完成,采集的数据通过微处理器的内部总线传输到系统内存,提供给微处理器分析、处理和存储。系统10ms采集一次数据,采集5次数据取其平均值,方差,最大值,最小值,将上述所得值和采集时间一并存入数据库中,并在液晶屏中绘制数据采集曲线。系统对采集过程进行实时监控,如果发现异常,则通知采集模块抛弃前5次采集到的数据,重新进行采集。
本采集系统在sqlite数据库中建有两个表,一个是Data_table(INTEGER did,REAL average),用于存储五次采集所得的平均值,另一个表为Monitor_table(INTEGER mid,REAL average,REAL max,REAL min,REAL variance)存储最大值,最小值,平均值和方差。Data_table表中的数据为系统需要的采集数据,系统会定期将其通过网络传送到远端主机,而Monitor_table中的数据则显示了采集数据的状态信息,监控系统会通过这些参数并结合采集信息来判定系统是否异常,如果出现异常系统会以报表形式自动打印这些信息供工作人员查看。
由于采集系统的采集频率很高,数据库中的数据会急剧膨胀,过多的数据会影响系统存取性能,因此采集系统会每隔2小时对数据库进行一次减负处理。减负处理的策略如下,对于Data_table表,系统会使用dump()函数将表中的数据导出并存储在缓冲模块提供的缓冲片中,以备传输。对于Monitor_table表,由于该表中的数据只是当前采集数据的相关参数,当与其有关的数据被传输后,这些参数也就没有太大的存在意义,因此系统会以2个小时为一个操作周期将该表中的前60万条数据进行删除。
在此模块中采用多线程设计,一个线程进行数据采集,一个线程进行数据监控。用到QT中的QThread和QMutex类。具体结构如下:
class AcquireThread
:public QThread
{
public:
AcquireThread();
void acquiredata();
void run();
void stop();
private:
Qchar *buffer;
};
class MonitorThread
:public QThread
{
public:
MonitorThread();
void monitordata();
void run();
void stop;
};
采集线程和监控线程间需要同步,只有当采集线程采集完成后监控线程才可以对采集到的数据进行进空处理。互斥操作如下:
QSemphore semaphore; //
利用semphore实现同步
void AcquireThread
::run()
{
acquiredata();
semaphore++;
}
void MonitorThread
::run()
{
semaphore--;
monitordata();
}
2.
数据缓冲模块
本系统会定期将数据库中的数据导出并通过socket传送到远端主机,以此来减少嵌入式平台上数据总量,但由于网络繁忙时并不能保证数据会被及时的传出,所以需要开辟一个缓冲区用来存放从数据库中导出的数据。由于没有 MMU的支持,uClinux不能提供内存保护机制,进程可以随意读取任何内存地址。这样,在带来方便的同时也增加了些麻烦。一方面表现在可以在进程中开辟缓冲区,在内核中用同样的地址使用该缓冲区;另一方面不利之处表现在开辟动态内存必须十分小心,不能和其他进程发生重叠,以防内核泄漏。
本系统的数据缓存策略是在进程中开辟 40个数据缓冲片,这些缓冲片通过1个缓冲队列和4个发送队列进行维护。由于远端主机对不同数据有着不同的传送时间要求,对一些急需数据需要短时间内传送到,而对一些非急需数据只要在规定时间内传送到即可,所以为了增强系统的实时性能,需要对数据进行优先级分级。基于此,系统设计了4个发送队列,one_queue,two_queue,three_queue和four_queue,其中one_queue具有最高的优先级。系统传输数据时先用getdata()函数从高优先级队列中取数据片,如果该队列中无数据,再依次从优先级较低的队列中取数据。数据片中的数据传输完毕后将空片放入buffer_queue队列。相反,当把数据库中的数据导出时,则从buffer_queue的队头中取出空片,存入数据后根据相应的数据优先级将数据片存入到不同的发送队列中。以上策略为网络速度的不稳定提供了缓冲,保证了系统的实时性要求,并将网络数据传输率需求控制再可行范围内。数据缓冲图如下所示。
导入数据
|
传输数据
|
嵌入式数据库
sqlite
|
图1 数据缓冲图
3.
数据监控模块
数据监控模块主要是监控系统的状态,对采集到的数据进行有效性检查。监控模块大体上包含了数据监测和异常处理两个过程。数据监测过程主要运用相关监测算法判断系统是否出现异常。本系统采集到的数据经过转换得到的Ta,Ta的取值范围在0到10之间,正常情况下Ta落到1.5到8.5之间的概率为95%,因此如果Ta取值在0-1.5和8.5-10这两个区间内,则视为小概率事件发生,但在正常情况下,小概率事件不会连续发生,因此如果此小概率事件在规定的时间内发生次数超过限定值,则视为系统发生异常。本系统限定时间位5秒,累积上限定为2,即如果系统在5秒内,有两次取值都落在了小概率区间内,则判定系统出现异常。
报警模块主要作用是通知相关人员系统出现异常。其方式主要有两种,一种方式通过于主服务器相连的语音设备发报警信号。另一种方式是通过调制解调器拨号到PSTN,发信号到工作人员的座机或手机上,完成报警。
4.
数据传输模块
数据采集系统的数据需要传送到远端主机进行进一步的处理。一般的数据传输过程大体经过流控处理,差错控制和差错检测三个过程。流控技术用于防止数据接收方出现数据溢出。本系统中远程主机的处理性能和缓冲区大小都远远高于采集系统,所以在正常情况下不会出现数据溢出,因此数据传输模块不进行专门的流控处理。差错控制用于处理错误帧和丢失帧,目的是增前传输的可靠性。由于重传会影响系统继续帧的传输,因此本系统采用的差错控制策略是直接将错误帧抛弃,丢失帧也不在进行重传。差错检测用于判断传输数据是否出现错误。本系统的差错检测过程主要使用循环冗余检错(cyclic redundancy check,CRC)算法。基本原理如下:已知一个数据块包含有k位,发送器产生一个包含有n位的序列,这个序列称为帧检测序列(FCS),把FCS加到数据块的后面组成一个包含有k+n位的发送帧T,使得T能够用一个已知数P整除。接收器把接收到的帧除以P,如果没有余数,则认为没有出错。本系统中P=111001(k=6),n=5。
数据传输模块使用到了QT中的QSocket进行数据传输,在此实现可靠连接的TCP传输。
客户端设计:
客户端主要设计的QT类有QSocket,QTimer,TripPlanner,其中TripPlanner继承至QT的QForm类。
class TripPlanner
{
public:
void init();
void connectToServer();
void sendRequest();
void updateListView();
void closeConnection();
void error();
private:
QSocket socket;
QTimer connectionTimer; //
用来终止一个持续太长时间的连接
Q_UINT16 blocksize; //
用来解析和服务器间传输数据的变量
};
void TripPlanner
::connectToSever()
{
…….
socket.connectToHost(“192.168.256.253”,6170); //
连接主机,主机被连接的端口为6170
……..
}
void TripPlanner
::sendRequest()
{
QByteArray block;
待传数据
………
Socket.writeBlock(block.data(),block.size()); //
向主机传输数据
……….
}
服务器端设计:
服务器包含两个类:TripServer和ClientSocket。TripServer类继承了QServerSocket,允许我们接收来访的TCP连接类。ClientSocket重新实现了QSocket并且处理了一个单独的连接,任何时候,在内存中ClientSocket对象的数量和正在被服务的客户端数量都是一样的。
class TripServer
:public QServerSocket
{
public:
TripServer();
void newConnection(int socket);
}
TripServer
类重新实现了newConnection()函数,只要采集系统客户端试图连接主机,这个函数就会被调用。
TripServer ::TripServer(QObject *parent, const char *name) :QServerSocket(6178,1,parent,name)
{
}
此处端口设置和客户端设置相同。
void TripServer
::newConnection(int socketId)
{
ClientSocket *socket=new ClientSocket(this);
Socket->setSocket(socketId);
}
class ClientSocket
:public QSocket
{
public:
clientSocket();
private slots:
void readClient(); //
读取采集客户端的数据
}
6.3
应用程序详细设计
6.4
小节
本数据采集系统由于采用了嵌入式数据库进行相关数据的采集和处理,避免了使用文件进行存储时需经常使用IO通道,导致实时性能差和安全性低的缺点。另外,系统采用的多线程机制,可以使数据采集,数据显示和数据监控三个过程同时进行,增加了系统的并行性和实时性,同时大大的增加了系统的安全性能。经多次测试,证明本系统已经完全满足了一般采集系统对实时性,安全性和高效性的要求。
第五章系统开发中的重点问题探讨
5. 1
用虚拟文件系统实现数据词典在内存中的组织和管理
数据词典 ,亦称系统目录,是数据库管理系统(DBMS)访问和管理数据的基本依据。DBMS一般提供数据定义语言(DDL)来定义外模式、模式和内模式。模式翻译程序把用DDL书写的各种源模式翻译为相应的目标模式。这些目标模式描述数据库的结构(而非数据库中的数据),存放在数据词典中。
本模型系统中的嵌入式数据库管理(EDBMS) 模块在嵌入式操作系统Vtech VT-OS 1.0平台上开发,EDBMS模块负责PDA嵌入式数据库的管理和访问,运行时需要解决EDBMS数据词典在内存中组织和管理问题。
为此, 在 VT-OS1 .0操作系统提供的内存管理机制的基础上,建立一个虚拟文件系统。该虚拟文件系统模拟层次文件系统的方式组织和管理数据词典信息,为EDBMS模块借助数据词典管理EDBMS的数据提供了类似于层次文件系统的分层的管理接口。虚拟文件系统分为两层结构,其概念模型如下图所示:
数据表管理文件
|
数据表文件
|
数据表文件
|
数据表文件
|
… … …
图5-1 虚拟文件系统的概念模型
在这两层结构中,位于下层的数据表文件中存放着EDBMS数据库表中的数据,一个数据表文件对应一个用户创建的EDBMS数据表。位于上层的数据表管理文件中存放内存中所有数据表文件的组织结构信息,其中包括各个数据表文件的文件名(与EDBMS数据表的表名相同)、对应数据表的字段数、字段结构和表中纪录数等。
建立了这样的虚拟文件系统后,上层应用(EDBMS嵌入式数据库管理模块和同步模块)即可通过调用接口函数获取数据库管理文件中的信息,得到每个数据库表的结构信息,并借此实现对数据库表的管理和操作。
上述概念模型在内存中的具体实现方式如下:
文件个数
|
DBMS_
FILEINFO
结构(1)
|
DBMS_
FILEINFO
结构(2)
|
…
…
|
DBMS_
FILEINFO
结构
(DBMS_
MAX_
FILENUM
|
文件
数据
区(1)
|
文件
数据
区(2)
|
…
…
|
文件数据区
(DBMS_
MAX_
FILENUM)
|
可将上图所示内存区域以“文件数据区(1)”的前端为界划分为两部分,前一部分对应数据表管理文件,后一部分对应数据表文件集合。在数据表管理文件区,最前端为内存中实际存放的数据表文件的总个数(设为S),接着存放DBMS-M AX_FI LENUM (数据表文件在内存中存放个数的最大允许值)个DBMS _FILEINFO结构(该结构中保存对应数据表文件的文件名、文件长度、句柄等信息)。这DBMS MAX _FILENUM个结构中,只有S个结构已占用,其余结构为空。在第二部分的数据表文件区中,存放DBMS _MAX _FILENUM个件数据区,每块文件数据区的大小为DBMS _FILESIZE(数据表文件大小,为预先定义的常量)。同样,DBMS_MAX_FI LENUM个文件数据区中只有S个数据区己使用,其余数据区为空。
上面介绍了虚拟文件系统的设计及其在内存中的实现方法。在虚拟文件系统的使用中,文件符合如下的操作规则:为(1)文件可以被多次打开;(2)文件通过文件句柄方式访问;(3)读写数据表中的数据时需将整个数据表文件读出或者写入。
用户进行数据表操作时,首先需要对数据库初始化,即从数据表管理文件中将数据库的有关信息读到内存中。如果打开了某个数据表,则把表中数据读入到内存中,形成相应的数据表文件。初始化数据库成功后,内存中就产生了一些全局变量,这些全局变量用来管理和指示表的打开和使用情况以及记录数据。数据表通过句柄来操作,成功打开一个表后,就会得到一个句柄。通过此句柄,可以调用数据表的有关函数,如添加,删除,插入等等。表用完后需要关闭,以便将纪录写回物理存储中,并释放表在内存中的占用空间。在内存中,数据表之间通过指钊一相连接,表中的纪录之间也通过指针相连接,通过结构指针方式可以访问到任何一个打开表中的任何一条纪录。
在虚拟文件系统中,一个句柄就像是虚拟内存系统中的一个虚拟地址:它指明所代表的数据表文件放在第几块数据区中,并不直接对应实际物理内存地址。而这个数据区序号与实际物理内存地址的映射工作便由虚拟文件系统来完成。访问数据表文件中的数据时,需要锁定这个相应的句柄,获得地址指针;完成数据访问后,对句柄解除锁定,操作系统就会收回这段存储单元,用于其它用途。
在句柄的使用中,应有尽可能释放句柄的习惯。同样,也不要在释放了一个句柄之后,还在继续使用与之对应的地址指针。因为一旦某个句柄被释放,系统就会用该句柄的指针所指的内存空间来存放其它的数据。如果这时程序还像以前那样访问这部分存储单元的话,就会因这部分毫不相干的数据引起错误甚至导致系统崩溃。
虚拟文件系统中的文件操作函数包括以下内容:DBMS_Fi leSyslnit初始化文件系统、DBMS_CreateFile创建新文件、DBMS_De leteFile删除文件、DBMS_OpenFile打开文件、DBMS_CIoseFile关闭文件、DBMS_G etFileSize得到文件大小、DBMS_R eadFile读出文件数据、DBMS_WriteFile将数据写入文件。
由上述内容可知,该虚拟文件系统只是借用了多级文件管理系统中层次化管理的概念,而与传统意义上的文件管理有很大的差别。其管理的物理存储介质是内存RAM,而不是永久性存储介质(闪存FLASH),系统掉电时将导致此虚拟文件系统中数据的丢失。
5. 2
数据同步方式的拓展
随着嵌入式数据库技术的不断进步,在嵌入式系统中广泛应用的同步技术也得到了相应的发展。当前嵌入式数据库领域先进的同步技术,可用于在企业系统(中心数据库)和远程设备(手持设备和智能电器)之间进行可伸缩的、双向的信息同步。兼顾同步环境和异步环境的应用需求,可以同时满足偶然连接和近乎实时连接的环境的要求。
与嵌入式数据库系统同时推出的同步服务软件作为移动数据库系统三层体系结构中的中间层,为嵌入式数据库(EDB)和后台远程主数据库(RDB)之间的双向数据交换搭起桥梁。以人大“小金灵”嵌入式系统的同步技术为例,同步技术具有以下特点:灵活的同步方式〔上载、下载、混合等)、表级异步复制技术、全新的基于数据同步对象的同步技术、灵活的应用数据模式、增量数据上载、支持多种通信协议(包括串口通信、TCP/IP协议等)、支持多种数据源、支持事务性数据同步、必要的冲突解决方案、提供方便的应用模式设计管理工具等。
当前,国内、外几种主流嵌入式数据库管理系统己成功地实现了如下几种通讯协议上的同步技术:
(1 )
基于TC P/IP协议的同步。其同步的原理是:远程设备通过标准的Internet协议(TCP/IP)与同步服务器连接,而服务器通过ODBC与后端的数据库通讯。
(2 )
基于F TP协议或E-MAIL的同步。这种同步技术基于存储转发结构,可支持偶然连接的用户通过文件和消息传输机制(如FTP或电子邮件)来同步数据。以电子邮件方式为例,需要同步的双方一各有一个专门的电子邮件帐户,可通过手动或定时的方式将需要同步的数据传到对方的邮件帐户中,对方可以读取邮件的内容来同步双方的数据库中的数据。可以通过只发送变化数据减少通讯费用。
(3)
基于 IrDA 协议的同步。Infrared Data Association(IrDA)红外数据通信协议使没有物理连线的计算机之间可以传送信息,共享资源。多数新型手持设备均有IrDA的硬件支持,只需将两个配备了IrDA的计算机放到一定距离内,IrDA即可自动配置并建立连接。
(4)
基于特殊的协议的同步。包括无线Sybase的同步技术支持在LAN和公共网之间进行无线同步,从而可以对企业信息进行近乎实时的访问。对于手持设备,MobiLink同步技术支持特殊的协议,包括Palm Computing HotSync。Sybase也支持RiverBed ScoutSync和Palm HotSync Server,可减少通过PC或工作站同步的需要。
(5 )
基于蓝牙技术的同步。“蓝牙”技术是指通用型无线信号传输接口及其操控软件的公开标准。蓝牙技术是无线数据和话音通信标准,旨在建立低成本、短距离的无线连接。它将所有的技术和软件集成于9mmx9mm的微芯片内,为无线和静态通信环境提供带保护的特殊连接。同步技术在蓝牙尤线通信协议中的实现将把同步技术的应用延伸到更深更广的领域。
在PDA 嵌入式数据库系统的首期开发中,只实现了PDA和PC机通过串口进行通信的情况,并没有进行针对其它通信协议的同步技术的开发。预计在该系统的后期开发中将在TCP/IP协议、蓝牙技术等方面实现数据同步,因此,开发中保留了足够的可扩展编程接口,以便实现向其它通信协议的扩展。
5. 3 ODBC
技术及异构数据源管理
ODBC
是用于数据库访问的应用最广泛的应用程序编程接口 (API)。它是为最大的互用性设计的,即允许应用程序使用同种源代码访问不同的数据库管理系统(DBMS) ODBC通过加载驱动程序,使应用程序与具体的数据库应用相互分离。使用ODBC可实现具有相同源代码的应用程序对多个DBMS的访问,也可使应用程序同时访问多个DBMS。在驱动程序针对于数据库模块中实现了ODBC接口之后,数据库应用程序通过ODBC接口调用函数来实现其自身的功能。借助于ODBC技术,只需要添加一个新的驱动程序,就可以使应用程序能够访问新的DBMS,而驱动程序在运行时才会加载,因此不必重新编译或者重新连接应用程序。
ODBC
技术为Microsoft数据访问组件(MDAC)包含,提供了一种对所有数据都易于使用、可编程的访问方式。在web或局域网上开发的数据驱动客户机/服务器应用程序能使用这些组件很容易结合来自各种各样的资源的信息。Microsoft数据访问组件包括ActiveX数据对象(ADO)和远程数据服务(RDS),Microsoft为ODBC提供的OLEDB供应商、开放的数据库连接(ODBC)和为Microsoft SQL Server, Microsoft Access和其他桌面数据库以及Oracle数据库提供的ODBC驱动器,所有这些组件都已经发布,成文并且获得支持。
OD BC
包 括以下4个组件:
应用程序 (Application):处理ODBC函数调用、发送SQL语句、检索查询结果并负责数据的处理和程序的其他功能。
驱动程序管理器(DriverM anager):根据应用程序的需要装载或者卸载ODBC
驱动程序,处理ODBC函数调用,或者将ODBC调用转发给ODBC驱动程序。
ODBC
驱动程序(Driver):向指定的数据源提交SQL语句,向应用程序发送返回结果。
数据源 (DataS ource):用户想要访问的数据以及与访问这此数据相关的操作系统、DBMS、网络平台等
4
个组件之间的关系如下图:
应用程序
|
驱动程序管理器
|
驱动程序
|
驱动程序
|
驱动程序
|
数据源
|
数据源
|
数据源
|
… … … …
… … … …
ODBC
有两种实现方法:使用MFC ODBC类进行编程和使用ODBC API函数开发应用程序。MFC ODBC类提供了简化的数据库开发手段,但未提供对数据库的底层控制。使用ODBC API函数可实现大量的底层编程工作,使应用程序具有更高的性能。
5.4
小结
本章探讨了嵌入式数据库系统设计开发中的几个重点问题,包括:用虚拟文件系统实现数据词典在内存中的组织和管理、ODBC技术以及数据同步方式的扩展。