1、第第5章章 嵌入式嵌入式Linux开源软件移植与开源软件移植与应用应用第1页,共62页。第五章第五章 嵌入式嵌入式LinuxLinux接口设计与接口设计与驱动程序驱动程序主要内容主要内容 第一节 嵌入式WebServer GoAhead的移植与应用 第二节 嵌入式WebService gSOAP的移植与应用 第三节 嵌入式数据库SQLite的移植与使用 第四节 播放器Mplayer的移植 第五节 ffmpeg应用 第六节 开源软件移植的一般过程 第七节 J2ME-phoneME移植 第八节 嵌入式浏览器konqueror移植 第2页,共62页。第五章第五章 嵌入式嵌入式LinuxLinux接口
2、设计与接口设计与驱动程序驱动程序主要内容主要内容高端嵌入式系统往往基于一个功能强大的操作系统,而使用Linux进行架构的好处之一就是可以从X86机上移植大量软件做嵌入式开发。本章介绍了多个软件的移植以及应用,包括嵌入式Web 服务 GoAhead、嵌入式数据库SQLite、嵌入式媒体播放器Mplayer、JVM phoneMe、Web 服务gSOAP、Web 浏览器Konqueror。由于Linux软件的开源特点以及交叉编译工具的使用,向嵌入式平台上移植丰富的软件成为一件非常轻松的事情。需要特别注意的是相关软件的版本与依赖关系,包括交叉编译器。第3页,共62页。内容:内容:一、嵌入式一、嵌入式
3、Web服务器服务器 二、二、GoAhead介绍介绍 三、三、GoAhead在在ARM平台上的移植平台上的移植 四、页面操作四、页面操作 第一节第一节 嵌入式嵌入式WebServer GoAhead的移植与应用的移植与应用第4页,共62页。随着后PC机时代的到临,计算机的发展已经从以PC机为中心转向了以嵌入式系统为中心的方向:嵌入式系统的迅猛发展和IA(信息电器)的不断成熟使得其应用越来越广泛。其中,嵌入式系统与网络的结合也是当今发展的一大趋势,而嵌入式网络技术的产生正好迎合了这个趋势。由于嵌入式系统的专用性强、体积小且价格低廉,使得嵌入式设备已经开始应用于智能家居系统、工业智能化从站系统、LE
4、D网络控制显示屏系统、网络安全加密系统等各个网络相关领域。在嵌入式设备中,所谓的瘦Web服务器,即功能不会很全面的Web服务器,往往拥有有限的资源。因此实现嵌入式WebServer方案的主要技术难点是:在不影响其整体性能的前提下,如何利用它自身有限的资源,同时又必须满足Web应用服务器的特征。第一节第一节 嵌入式嵌入式WebServer GoAhead的移植与应用的移植与应用 一、嵌入式一、嵌入式Web服务器服务器 第5页,共62页。由下图可以看出:由于HTML语言的标准统一性,只要在嵌入式设备中存在一个微型服务器,就可以使用任意一种Web浏览器接收和发送信息。所以如何在嵌入式设备中设计和安装
5、Web服务器,就成了嵌入式Web服务器的发展和研究方向。第一节第一节 嵌入式嵌入式WebServer GoAhead的移植与应用的移植与应用 一、嵌入式一、嵌入式Web服务器服务器 第6页,共62页。GoAhead Webserver是为嵌入式设备的需要而设计的。该Webserver软件不仅开源,而且具有各种各样的特性,包括支持活动服务页、嵌入Java描述语言、in-process CGI形式、SSL、文摘访问认证、用户管理和标准CGI等,脚本大小仅为60K。这对于那些需要在基于浏览管理模式的设备上传递动态信息的系统管理开发人员来说,这点非常重要。GoAhead Webserver支持多种操作
6、系统和开发平台,包括Windows NT/98/95、Windows CE、Embedded Linux、Linux、VxWorks、QNX和Lynx等,它也有其它操作系统的定制产品,因此具有很强大的可移植性。GoAhead网络服务器的发展同时也促进了嵌入式网络服务器的源代码的进化。由于其开源,世界各地的厂商和爱好者都纷纷下载并优化GoAhead的源代码,这也使得GoAhead WebServer成为市场上最优秀的嵌入式网络服务器之一。作为一款嵌入式Web服务器,GoAhead具有如下特点:优点:免费,体积小巧,支持多平台,完全针对嵌入式系统设计,支持嵌入的JavaScript与动态数据页。缺
7、点:其对ASP的支持意味着要依靠微软的平台,安全方面的考虑很少。第一节第一节 嵌入式嵌入式WebServer GoAhead的移植与应用的移植与应用 二、二、GoAhead介绍介绍第7页,共62页。完成GoAhead移植后,需要在此基础上完成系统运行所需要的页面文件,透过页面文件来实现Web对终端的管理。页面操作方式有三种,如下介绍所示:1,静态页面,静态页面静态页面可在http编辑工具中完成,完成直接下载至相应的Web存放目录即可,此种方式可完成诸如说明文档、终端信息等固定内容,但无法和用户进行交互操作。2,cgi页面页面cgi页面,即可用C语言编辑的页面,其操作方式可参考cgitest.c
8、文件(该文件存放在GoAhead2.18webcgi-bin目录下),使用时需要将此文件加入项目中一起编辑。GoAhead WebServer任务启动后,在地址栏中直接输入192.168.0.121cgi-bincgitest(其中192.168.0.121为Web服务器的IP地址)就可以观察到相应结果。GoAhead的cgi入口处理中,在地址栏内如果带有cgientry=name的字样时,则处理器会寻找name函数来处理该请求,相反,如果没有此请求字样时,GoAhead搜索名称为name_cgientry的函数,即请求的名称增加后缀_cgientry;另外需要注意的是cgi任务的退出要使用r
9、eturn,而不是使用任务删除,return退出后,系统会重新定位stdin、stdout等,否则由cgi重定位的输入输出会保持,会影响后续的其他类型的Web请求。第一节第一节 嵌入式嵌入式WebServer GoAhead的移植与应用的移植与应用 四、页面操作四、页面操作 第8页,共62页。3,嵌入式,嵌入式Javascript嵌入式Javascript是GoAhead WebServer提供的一种方式,其采用表单提交的方式,提供了完善的输入输出流程控制,同样可采用C语言进行设计,可很好的与系统其它部分实现代码共享。如Today is,此句代码即可在网页上输出“Hello World”字样。
10、由于采用表单提交的方式,通过特殊的标记印记,嵌入已经实现的C函数至页面文件中,在提交时,由已经在系统定义并注册的函数来接收处理,通过代码写Web页面来实现输出。其设计过程主要涉及以下几个方面:1)页面设计)页面设计。嵌入式Javascript文件为asp文件,其内容可按照标准的javascript来设计,在创建页面过程中,如果需要从原系统中动态生成页面,如当前终端的参数配置,此时需要使用嵌入式Javascript的独立定义,在需要嵌入创建函数的地方用如下格式加入:,此函数需要事先定义好并在系统启动向WebServer注册完成。第一节第一节 嵌入式嵌入式WebServer GoAhead的移植与
11、应用的移植与应用 四、页面操作四、页面操作 第9页,共62页。2)创建函数定义)创建函数定义:一个标准的创建函数int aspCreateHomeAsp(int eid,webs_t wp,int argc,char_t*argv),前面两个参数为页面参数,不能改动。3)注册创建函数:)注册创建函数:websAspDefine(T(CreateCurrentUser),aspCreateHomeAsp)使用此函数注册后,如果asp页面中出现,则WebServer会调用aspCreateHomeAsp()来输出页面。4)Form提交函数:提交函数:要达到交互使用,则必须响应用户提交,要做到这一点
12、,很简单,在页面中加入,其中AddGroup即为响应时系统调用的注册后的函数。当然,需要提交的按钮项需在此form体内完成。其函数格式为:static void formAddGroup(webs_t wp,char_t*path,char_t*query)。5)注册)注册Form提交函数:提交函数:websFormDefine(T(AddGroup),formAddGroup),webServer运行此函数后,当页面用提交时则调用formAddGroup()函数来处理。第一节第一节 嵌入式嵌入式WebServer GoAhead的移植与应用的移植与应用 四、页面操作四、页面操作 第10页,共
13、62页。内容:内容:一、一、gSOAP介绍介绍二、二、gSOAP裁减裁减 三、三、gSOAP应用应用第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用第11页,共62页。Web Service是近几年较为流行的Web应用开发技术。它改变了传统的B/S或C/S软件开发模式,为软件实体之间共同协作提供了公共平台。而这里我们所使用的gSOAP则是其中非常方便使用在嵌入式系统上的编译工具。gSOAP编译工具提供了一个SOAP/XML关于C/C+语言的实现,它利用编译器提供了一组透明化的SOAP API,这就将与开发无关的SOAP实现细节对用户隐藏起来。因此,使用gSOA
14、P工具生成程序非常方便。gSOAP的使用范围也非常广泛,能够集成C/C+代码、Fortran代码、其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境等等。gSOAP包含一个WSDL生成器,可以生成Web服务的解释。通过gSOAP的解释器以及导入器,用户可以不需要分析Web服务的细节就能够实现一个客户端或者服务端程序。gSOAP可以理解为一个C/C+的Web服务协议栈,该协议栈主要包括五部分:网络传输,Web服务调用(消息传输),Web服务描述与注册(接口描述、发布与发现),Web服务质量(安全性,可靠性,事务控制),Web服务工作流(商业流程、事务等)第二节第二节 嵌入
15、式嵌入式WebService gSOAP的移植与应用的移植与应用 一、一、gSOAP介绍介绍 第12页,共62页。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 一、一、gSOAP介绍介绍 第13页,共62页。虽然gSOAP实现Web服务协议栈比较复杂,但是用gSOAP开发Web Service是非常方便的。gSOAP工具包中提供了两个可执行文件,wsdl2h和soapcpp2。wsdl2h用来解析wsdl文档生成描述服务的C/C+头文件,例如你可以用如下的命令将一个wsdl文档转换为一头文件:$./wsdl2h o outputfile.h inputfi
16、le.wsdl上面的命令根据制定URL提供的WSDL文档生成一个C+语法结构的头文件。假如需要生成一个纯C的头文件,需要用如下命令:$./wsdl2h c o outputfile.h inputfile.wsdl其中inputfile.wsdl可以是本地文件系统上的文件,也可以存在于Web页上,例如:$./wsdl2h-c-o outputfile.h http:/xxx.xxx.xxx/xxx/inputfile.wsdlsoapcpp2用来解析上面生成的头文件并生成框架代码,这些框架代码是:soapStub.h 从输入头文件生成的经过修改且带名称空间前缀的头文件,soapH.h 主头文件
17、,所有客户机和服务源代码都要将其包括在内,soapC.c 指定数据结构的序列化器和反序列化器,soapClient.c客户机存根例程,soapServer.c服务器端存根例程 第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 一、一、gSOAP介绍介绍 第14页,共62页。另外,在gSOAP工具包中还包含两个重要的文件:stdsoap2.h和stdsoap2.c/cpp。其中stdsoap2.h是stdsoap2.c/cpp 运行时所需库的头文件,stdsoap2.c/cpp是运行时 C/C+库,带 HTTP/SOAP 解析器和运行时支持例程。用户可以用这两个
18、文件和上述的框架代码方便的进行客户端/服务器端开发。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 一、一、gSOAP介绍介绍 第15页,共62页。用gSOAP开发的Web Service服务器端和客户端的交互模型,如图所示。从图中可以看出:soapC.c和stdsoap2.c是构成客户机与服务端的重要的源文件,其中soapC.c是上面提到的序列化器和反序列化器,当建立请求或响应时需要用到它的序列化功能,而解析请求或响应时需要用到它的反序列化功能。stdsoap2.c是gSOAP工具包提供的HTTP/SOAP解析器 第二节第二节 嵌入式嵌入式WebServi
19、ce gSOAP的移植与应用的移植与应用 一、一、gSOAP介绍介绍 第16页,共62页。裁减gSOAP是为了将Web服务协议栈移植到嵌入式系统中,这类似于向嵌入式系统中移植TCP/IP协议栈。裁减的目的并不是得到一个比较通用的精简Web服务协议栈,而是从某个应用角度出发来对gSOAP进行裁减。1超文本传输协议超文本传输协议HTTP协议协议超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议。它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外,还可以通过扩展它的请求方式,错误代码和报头来完成许多任务。由于
20、HTTP的使用极为广泛,使得SOAP常常采用HTTP作为底层通讯协议。1)HTTP CookieHTTP Cookie是在HTTP连接期间浏览器与CGI程序之间传递的信息。在没有涉及到浏览器与CGI程序之间通信的程序中,该功能可以被裁减。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第17页,共62页。2)HTTP Chunked编码编码有时服务器生成HTTP回应是无法确定消息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码。如果HTTP回应的消息长度是可以
21、确定的而且比较小,则可以不支持HTTP的Chunked编码方式。3)HTTP Proxy它的主要功能就是通过网上的代理服务器代理用户去取得网络信息。如果在客户与服务器之间没有设置代理服务器,则HTTP Proxy的功能不必在系统中实现。4)HTTP Keep-AliveKeep-Alive功能使客户端到服务器端的连接持续有效,客户端为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP要在客户端和服务器端分配TCP缓冲区,并维持TCP变量。当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。对于嵌入式设备来说,系统资源非常有限,因此每次通信完成后应立即
22、释放连接,尽量避免长期占用系统资源而不释放。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第18页,共62页。2可扩展标识语言协议可扩展标识语言协议XML协议协议 XML(eXtensible Markup Language,可扩展标记语言)是Internet上数据表示和数据交换的新标准。它是ISO(International Organization for Standardization,国际标准化组织)的SGML(Standard for General Markup Language,通用标记语言标准)的一个简化子集。XM
23、L关注信息本身,是Web上表示结构化信息的一种标准文本格式。与传统的注重页面信息显示的HTML(HyperText Markup Language,超文本链接标示语言)相比,关注于内容的XML具有以下诸多优点:良好的可扩展性,语言简单有效,可自行定义标记;内容与形式的分离,主要刻画数据内容,不考虑显示效果;有严格的语法要求,便于分析统一和与数据库信息转换;便于传输,为纯文本形式,可通过HTTP协议直接传输,可跨越防火墙等等。gSOAP工具包中提供了XML解析器,但是对于具体的应用而言,不必对XML协议完全解析,经过分析gSOAP源代码,可以对XML协议作如下的精简:第二节第二节 嵌入式嵌入式W
24、ebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第19页,共62页。1)精简编码方式精简编码方式XML文档一般采用UTF-8编码方式,UTF-8可以处理目前世界上使用的每一种文字。虽然还有少数空白,但是越来越不明显,被逐渐填平了。没有纳入的文字通常也没有其他任何字符集实现过,即使有也不能在 XML 中使用。如果对于某个嵌入式系统而言采用UTF-8编码方式已经足够了。那么对于其他的编码方式,解析器可以不支持。2)CDATA部件部件如果一个XML元素的文本中包含了大量非法的xml字符如“”和“&”字符,就像编程代码中经常出现的情况一样,那么这个XML元素就可以被定
25、义为一个CDATA部件。在CDATA部件之内的文本会被解析器忽略,从而避免了大量的实体引用。如果对某个嵌入式系统而言,SOAP消息中的XML文档是由gSOAP生成的,通过分析soapcpp2.exe生成的*.req.xml和*.res.xml可以看出该文档中并没有包括CDATA部件,则针对该文档,XML解析器不必解析CDATA部件。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第20页,共62页。3.简单对象访问协议简单对象访问协议SOAP协议协议SOAP(Simple Object Access Protocol)简单对象访问协
26、议是在分散或分布式的环境中交换信息的简单的协议。SOAP协议定义了用于在系统之间进行通讯的标准XML消息的格式。由于该消息格式已标准化并基于XML标准,因此可使用SOAP在多种计算机体系结构、语言和操作系统之间进行通讯。SOAP协议包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交
27、换信息。虽然这四个部分都作为SOAP的一部分,作为一个整体定义的,但他们在功能上是相交的、彼此独立的。特别的,信封和编码规则是被定义在不同的XML命名空间(namespace)中,这样使得定义更加简单。SOAP的一个主要优点就在于它的简单性,但是对于具体的应用来说,不可能运用了SOAP的所有特性。特别是在嵌入式设备上,系统的应用有限,此时有必要屏蔽掉多余的特性,第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第21页,共62页。1)可选的可选的SOAP头头SOAP协议规范说明SOAP消息包括三部分:一个必须的根元素,一个可选的SOA
28、P头和一个必须的SOAP体。其中SOAP头的作用就是提供了一个可伸缩的机制用于在分散的模块化的环境下扩展SOAP消息,而通讯双方并不需要有预先的约定。可以通过它传递一些辅助性的附加消息,比如身份验证,会话等。如果SOAP头是可选的且不被使用,那么可以将SOAP头裁减掉。2)数据编码规则数据编码规则SOAP编码可以简短地描述成简单值和复合值的集合。简单值可以是简单类型,如整型、浮点型和字符型,或者是内置类型,包括各种数据类型,如字节型数组和枚举。复合值包括结构、数组和XML架构制定组定义的复杂类型。gSOAP提供了对上述数据类型的序列化和反序列化规则。在本系统中使用到的数据类型包括整型、枚举和结
29、构。因此在gSOAP中保留以上类型的序列化和反序列化规则,而对于其他的数据类型诸如浮点型、数组等不支持其序列化和反序列化。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第22页,共62页。3)附件机制附件机制当我们想利用SOAP消息传输图像等二进制数据时,一种最简单的方法是使用类似Base64的方式对其进行编码,把它转变成对XML安全的一串字符然后放入一条基于XML的消息中传送。但是这并不是一个有效的方法,因为对二进制数据进行编码和解码会造成相当大的处理开销,从而影响了应用程序的性能。这些问题促成了带附件的SOAP消息(SOAP
30、Messages with Attachments(SwA))的开发。带附件的SOAP消息是一种特定于Web Services的技术,它使用MIME Multipart/Related数据包来随XML消息发送二进制数据和其它附件,从而避免了编码的开销。目前受到业界广泛支持的是MTOM(Message Transmission Optimization Mechanism,消息传输优化机制)和XOP(XML-Binary Optimized Packaging,XML二进制优化封装)。gSOAP支持MIME/DIME/MTOM附件传输机制,在本系统中涉及到了二进制图像数据的传输,起初尝试用MTO
31、M和XOP进行附件传输,但后来发现基于SOAP消息的附件传输始终不如用socket传输的速度快。对于一个要求获取实时视频数据的系统而言,采用基于SOAP消息的附件传输并不是一个好的选择。因此裁减了gSOAP中对SOAP附件机制的实现。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第23页,共62页。4.小结小结 以上三部分是对Web服务协议栈底层的三个重要协议进行分析并裁减了部分无关性质。但是对于整个Web服务协议栈来说,这仅仅精简了网络传输层和Web服务调用层。在它们之上还有Web服务描述与注册层、Web服务质量层和Web服务工
32、作流层,也可以对它们进行裁剪。如果对于服务的注册与发现没有将Web服务发布到UDDI注册中心,而是采用简单的分布式发现方式(WS-Inspection),由客户端直接向服务提供者请求一个服务描述的副本,根据此副本进行Web Service客户端开发,可以不需要UDDI。在移植gSOAP时,实际上是将该精简后的Web服务协议栈移植到嵌入式系统中。另外,gSOAP还提供了一些额外的功能如支持多种系统平台、DOM解析库、利用zlib库压缩数据功能、Plug-in扩展功能、FastCGI以及支持SSL(安全套接层协议)等。这些功能都可以通过条件编译有选择的实现,在移植的过程中可以将它们减掉 第二节第二
33、节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 二、二、gSOAP裁减裁减第24页,共62页。gSOAP应用应用一般开发一个gSOAP应用的过程是:写一个函数声明文件,来定义所有要实现的接口函数,该文件应该还含有命名空间的相关信息。创建Makefile文件,来利用gsoapcpp2工具生成框架代码。写一个服务端的程序,里面应该实现第一步中声明文件里的接口函数。写一个客户端的程序,接收输入的各参数,链接服务端。第二节第二节 嵌入式嵌入式WebService gSOAP的移植与应用的移植与应用 三、三、gSOAP应用应用第25页,共62页。内容:内容:一、嵌入式数据库一、
34、嵌入式数据库 二、二、SQLite介绍介绍 三、三、SQLite在在ARM平台上的移植平台上的移植 四、SQLite的使用的使用 第二节第二节 嵌入式数据库嵌入式数据库SQLite的移植与使用的移植与使用 第26页,共62页。随着计算机技术与其它学科间的不断交融渗透,数据库应用的范围更加深入和具体。那些仅适用于PC机、体积庞大、延时较长的数据库技术已不能满足嵌入式系统开发的需求。数据库的目标是实现对数据的存储、检索和增删等功能。传统的数据库产品除提供基本的查询、添加、删除等功能外,也提供了很多高级特性,如触发器、存储过程、数据备份恢复等。然而,在嵌入式系统中,由于软硬件资源有限,不可能安装庞大
35、的数据库服务器,因此一个简单的基于磁盘文件的数据库系统就可能实现相应的用户需求,而这仅仅是利用了数据库的基本特性。因此在这种特殊的应用场合下,传统的数据库就显得过于臃肿了。嵌入式数据库与传统数据库的区别是:嵌入式数据库采用程序方式直接驱动,而传统数据库则采用引擎响应方式驱动;嵌入式数据库的体积通常都比较小,而且具备功能齐全、可移植性强、健壮性等特点,因此嵌入式数据库常常应用在移动便携设备上。另外由于其性能卓越的特点,也应用于高性能数据处理场景。第二节第二节 嵌入式数据库嵌入式数据库SQLite的移植与使用的移植与使用 一、嵌入式数据库一、嵌入式数据库 第27页,共62页。SQLite是一款轻型
36、数据库,设计目标主要针对嵌入式系统。其占用资源少,在嵌入式设备中,可能只需要几百K内存就足够了。它能够支持Windows、Linux、Unix等等主流的操作系统,并且能够跟很多程序语言相结合,比如Tcl、PHP、Java以及ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来说,它的处理速度更快。SQLite虽然很小巧,但是支持的SQL语句不会逊色于其它开源数据库。在www.sqlite.org的网站上介绍SQLite的特点如下:ACID事务零配置不需要安装和管理配置储存在单一磁盘文件中的一个完整 的数据库数据库文件可以在不同字节顺序的 机器之间自由共享支
37、持数据库大小至2TB足够小,250K速度比大部分的普通数据库操作都要快第二节第二节 嵌入式数据库嵌入式数据库SQLite的移植与使用的移植与使用 二、二、SQLite介绍介绍 简单且易学包含TCL绑定,通过Wrapper支持其他语言的绑定良好注释的源代码,并且有90%以上的测试覆盖率独立:没有额外依赖开源支持多种开发语言第28页,共62页。SQLite发展到现在已经有了很多的版本,直到发展到现在已经有了很多的版本,直到08年年9月月22日已经推出了日已经推出了3.6.3的最新版本。的最新版本。SQLite在ARM平台上的移植一般要经历以下几个步骤:1)下载源码包,解压。安装配置交叉编译器。2)
38、在文件sqliteInt.h里面指定SQLITE_PTR_SZ的值为4,使btree(B树)有正确的变量大小,否则在ARM开发板上执行时,会出现如下问题:在文件btree.c中抛出断言,assert(sizeof(ptr)=sizeof(char*);3)修改configure文件,使其不去检查交叉编译环境。之后执行configure命令,生产Makefile文件。4)修改Makefile文件,将BCC变量里的编译器修改为X86的编译器,因为其编译生成的可执行文件要在宿主机上运行。同时,由于编译生成的可执行文件sqlite要在ARM开发版上执行,为了方便,我们将后面指定生成的库libsqlit
39、e.la改为libsqlite.a,即编译成静态链接的形式。5)去掉可执行文件sqlite中的调试信息,这样可执行文件也将变得很小。第二节第二节 嵌入式数据库嵌入式数据库SQLite的移植与使用的移植与使用 三、三、SQLite在在ARM平台上的移植平台上的移植 第29页,共62页。完成SQLite的移植之后,我们可以利用它创建一个数据库,实现基本的SQL语句功能,包括建表、插入、查询、删除等基本操作,如下所示:#sqlite schoolsqlite create table std(sno char(8),sname varchar(10),sage smallint);sqlite in
40、sert into std values(08000001,Li Lei,17);sqlite insert into std values(08000002,Jim,18);sqlite select*from std;08000001|Li Lei|1708000002|Jim|18在上面的例子中,我们创建名为school的数据库,并给这个数据库创建了表std,在表std中插入了两组数据,最后查询该表,显示表中的数据。第二节第二节 嵌入式数据库嵌入式数据库SQLite的移植与使用的移植与使用 四、SQLite的使用的使用 第30页,共62页。我们可以采用C语言编程,调用SQLite数据库,
41、实现类似上面的操作。在使用SQLite数据库进行编程时,我们要加上头文件sqlite.h,它是SQLite的API头文件。SQLite数据库中提供的接口主要有:sqlite_open(string filename,int mode,string&errmsg)该函数打开一个 SQLite 数据库。如果数据库不存在,将会创建它。如果成功打开,则返回数据库的句柄,否则返回FALSE。其中参数filename是数据库的名字,sqlite访问数据库文件可以使用相对或绝对路径;参数mode是打开数据库的访问权限,默认是0666;参数errmsg是返回的错误信息。sqlite_close(sqlite*
42、db)该函数关闭SQLite数据库。参数db是前面调用sqlite_open()函数返回的数据库句柄。无返回值。第二节第二节 嵌入式数据库嵌入式数据库SQLite的移植与使用的移植与使用 四、SQLite的使用的使用 第31页,共62页。sqlite_exec(sqlite*db,char*sql,int*callback,void*parg,string&errmsg)该函数主要是执行某个SQL命令。参数db是调用sqlite_open函数获得的数据库句柄;参数sql容纳了一个或更多SQL语句的字符串;参数callback是指向回调函数的指针,查询结果的每一条记录都会调用该函数;参数parg
43、成为回调函数的第一个参数;参数errmsg指向错误信息的指针。其中回调函数的结构如下:my_callback(void*parg,int argc,char*value,char*name)第一个参数是主调函数传递过来的指针;第二个参数为变量的个数;第三个为变量的值;第四个为变量的名称。第二节第二节 嵌入式数据库嵌入式数据库SQLite的移植与使用的移植与使用 四、SQLite的使用的使用 第32页,共62页。内容:内容:一、一、Mplayer介绍介绍 二、二、Mplayer在在ARM平台上的移植平台上的移植 1,安装并配置好交叉编译器,安装并配置好交叉编译器2,执行,执行configure命
44、令命令3,执行,执行make命令命令4,修改驱动源代码,修改驱动源代码第四节第四节 播放器播放器Mplayer的移植的移植 第33页,共62页。Mplayer播放器是Linux下最优秀的多媒体播放器之一。它的播放速度最快,资源占用率低,支持的文件格式也最多。Mplayer能使用众多本地的Xanim,RealPlayer和Win32 DLL编解码器,播放大多数MPEG、VOB、AVI、OGG、VIVO、ASF/WMV、QT/MOV、FLI、RM、NuppelVideo、yuv4mpeg、FILM、RoQ文件,并且能够观看VideoCD、SVCD、DVD、3ivx、RealMedia和DivX格式
45、的电影;MPlayer的另一大特色是支持广泛的输出设备:它可以在X11、Xv、DGA、OpenGL、SVGAlib、fbdev、Aalib、DirectFB下工作,而且你也能使用GGI、SDL(由此使用它们支持的各种驱动模式)和一些低级的硬件相关的驱动模式。Mplayer的功能还不止于此,它还能稳定地播放被破坏的MPEG文件、AVI文件,甚至播放没有索引部分的AVI文件,而这其中有些功能Media Player是做不到的。由于多媒体技术和计算机技术的不断发展和相互渗透,在嵌入式系统或者移动设备上听音乐看视频已经成为了一件很常见的事情。而Mplayer作为一款相当优秀的播放器,将其移植到嵌入式系
46、统中将是很有意义的。第四节第四节 播放器播放器Mplayer的移植的移植 一、一、Mplayer介绍介绍 第34页,共62页。Mplayer在ARM平台上的移植基本遵循X86平台上的安装步骤。即进入源码目录通过执行configure命令生成一个Makefile文件,再继续执行make和make install命令,最终就能够生成可执行程序mplayer。只不过ARM平台的体系结构和X86机不一样,因此在移植方面需要注意区别。另外由于其资源有限,也必须将某些功能进行裁剪。其移植具体步骤和过程如下:1,安装并配置好交叉编译器,安装并配置好交叉编译器这里使用的交叉编译器arm-linux-gcc版本
47、为3.3.2。注意编译Mplayer的交叉编译器是有要求的:如果使用2.95版本的armv4l-unknown-linux-gcc,会提示huffyuv.o文件找不到,即该版本无法成功编译Mplayer;如果使用高版本的交叉编译器,例如3.4.1版本也是不可以的,在编译到libavcodec/snow.c文件时会出问题。第四节第四节 播放器播放器Mplayer的移植的移植 二、二、Mplayer在在ARM平台上的移植平台上的移植 第35页,共62页。2,执行,执行configure命令命令将下载的压缩包解压。进入解压后的目录,执行configure命令,并附加一些选项进行相关配置3,执行,执行
48、make命令命令这一步主要是编译生成可执行程序mplayer。4,修改驱动源代码,修改驱动源代码该嵌入式ARM开发板的音频芯片使用的是菲利普uda1341,该芯片所使用的驱动是MIZI公司拥有版权的Linux uda1341音频驱动,这个驱动基本上符合了OSS的规范。不过当使用到多段DMA音频数据传输时,因为DMA缓冲的建立发生在第一次调用write()函数将音频数据传送到设备描述符的时候,此时缓冲尚未建立;然而OSS驱动的调用者通常要在打开音频设备描述时候,就期望获取DMA缓冲的信息,因而容易返回缓冲长度为0的结果,导致之后除零异常发生。此时需要修改源代码,使程序能够正常运行。如果不更改声卡
49、驱动程序,生成的mplayer程序仍旧可以执行,但是需要加上-nosound选项。之后播放的影片除了没有声音之外,运行会非常流畅。但是如果去除nosound参数就会报错signal 8。修改完驱动后,必须重新编译内核,然后烧写内核到开发板运行。第四节第四节 播放器播放器Mplayer的移植的移植 二、二、Mplayer在在ARM平台上的移植平台上的移植 第36页,共62页。内容:内容:一、一、ffmpeg简介简介 二、二、ffmpeg在在ARM上的移植上的移植 三、三、ffmpeg命令应用实例命令应用实例 四、ffmpeg中几个重要的数据结构中几个重要的数据结构 五、ffmpeg应用开发应用开
50、发 第五节第五节 ffmpeg应用应用 第37页,共62页。ffmpeg是一个开源、功能强大的多媒体处理软件,可以实现对音频流、视频流的录制和转换。如可以转换视频文件的格式,可以截取视频流中的某一画面等。它支持MPEG、DivX、MPEG4、AC3、DV等40多种编码和AVI、MPEG、OGG、Matroska、ASF等90多种解码。很多的开源播放器,如TCPMP、VLC、Mplayer等都用到了ffmpeg。尽管ffmpeg是在Linux环境下开发的,但是它不局限于Linux操作系统,能够运行于很多平台,包括Windows系统。ffmpeg主目录下主要有libavcodec、libavfor