导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→SQLite 在ARM-Linux 平台上的实现[原创][sz20120406]

 *第30781篇: SQLite 在ARM-Linux 平台上的实现[原创]

  
楼 主:sz20120406 2012年4月11日12:49
 SQLite 在ARM-Linux 平台上的实现[原创]
SQLite 在ARM-Linux 平台上的实现
SQLite 嵌入式数据库提供了以源码发布的方式,要在众多的硬件平台进行移植,可以根据不同平台对源码进行交叉编译来实现。编译主要有以下几个步骤:
① 到http :/ / www. sqlite. org/ 的cvs中下载最新的源代码包,解压并根据需要进行适当的修改后将生成sqlite目录,另外新建并转到一个与sqlite目录平行的同级目录,如make目录。
②用“echo $PATH”命令查看PATH中是否已经包含交叉编译工具arm linux gcc。
③为了在ARM Linux下能正常运行sqlite,需要对sqlite/ src/ sqliteInt . h作一定的修改,以确保bt ree (B 树)有正确的变量大小,如“pt r”和“char 3 ”。不同体系结构的Linux,如x86 和ARM,会有些差别。对于ARM2Linux可以找到如下部分:
# ifndef IN TPTR_ TYPE
# if SQL ITE_PTR_SZ = = 4
# define IN TPTR_ TYPE int
# else
# define IN TPTR_ TYPE long long
# endif
在上面的代码前加上一句
# define SQL ITE_PTR_SZ 4
这样后面的“typedef INTPTR_ TYPE pt r ;”就是定义的“int”类型,而不是“long long”。
④准备使用configure进行一些配置。请在sqlite目录下的configure中找到如下4处,并将他们注释掉,这样可以让configure不去检查你的交叉编译环境。 
⑤修改Makefile文件。将代码行BCC = arm linux gcc g O2 改成BCC = gcc g O2 。另外,一般是以静态链接的形式将sqlite 放到ARM Linux 的硬件板上运行的,所以继续修改Makefile ,找到标记为sqlite :的代码段,将其中的libsqlite. la 改成. libs/ libsqlite. a 。做完上述修改,用make 生成sqlite 、libsqlite. a 、libsqlite. so 。为了减小执行文件大小可以用st rip 处理,去掉其中的调试信息。
⑥在ARM 板上运行sqlite。将sqlite 拷贝到ARM板上,方法很多,需要根据具体的情况来选择。如ftp 、cm2 dftp 、wget 等。将sqlite下载到ARM 板的/ tmp 目录,因为此目录是可写的。修改权限并运行:
chmod + wx sqlite
. / sqlite test . sqlite
会出现
sqlite >  
如果一切正常,现在sqlite已经在ARM Linux下跑了起来,然后就可以基于此进行进一步的应用开发了。
4 SQLite 在ARM- Linux 系统中应用实例
在基于Linux的媒体网络附属存储(media network attached storage,Media NAS)系统中,选用SQLite数据库作为NAS系统中媒体数据的存储数据库,使得数字媒体播放设备通过UPnP ( universal plug-and-play)协议对NAS上的媒体文件进行播放。该系统中用户浏览媒体文件的流程如下::
(1)当用户浏览NAS系统中的媒体文件时,执行DatabaseOpen数据库打开操作。
(2)接着查找当前的SQLite数据库表,得到媒体文件的路径,通过DatabaseExecute执行SQL 查询语句得到路径。
(3)通过媒体文件的路径打开媒体文件,把媒体文件,通过UPnP网络发送出去。SQLite的特点决定了它与应用结合时的便捷性。作为数据的存储介质,SQLite文件被保存为一个普通的磁盘二进制文件,它无需一个服务器进程来提供服务,对SQLite数据文件的直接操作即可完成想要做的工作。结合应用需求,在应用层编写了一组对SQLite的API调用操作的简单封装,部分封装函数如下::
DatabaseOpen                             ;调用SQLite_open打开数据库文件
DatabaseClose                             ;调用SQLite_close关闭数据库
DatabaseExecute                         ;执行SQL命令
应用层的部分封装函数的实现代码如下::
int DatabaseOpen ( struct DBObj3 db, const char3 dbName)
{
char3 pzErrMsg = NULL;
structDB Info3 pDB info;     / /数据库文件指针
if (NULL = = dbName)               return 1;
pDBinfo = ( struct DB Info3 ) db - >   priv;
pDBinfo - >   stConnect = ( struct sqlite3 ) sqlite_open ( dbName, 0777, &pzErrMsg) ;
if ( NULL = = pDB info - >   stConnect )
 {
   printf ( " db open error. \n" ) ;
   return 1;
 }
 return 0;
}
int DatabaseExecute ( struct DBObj3 db, const char3 szSQL)
{
char3 pErrMsg = NULL;
int nErrorCode;
struct DB Info3 pDBinfo;
pDB info = ( structDB Info3 ) db —>   priv;
nErrorCode = sqlite_exec ( ( struct sqlite 3 )(pDBinfo - >   stConnect) ,
 szSQL, NULL, NULL, &pErrMsg) ;
return nErrorCode;
}
可以看出,各个封装函数是通过调用SQLite的API函数实现的。在基于Linux操作系统上使用SQLite,经测试嵌入式数据库响应迅速,运行稳定,用户基本感觉不到命令延迟,在浏览声音和图像媒体时流畅自然,充分验证了使用SQLite数据库的优越性。
(本文由Cogo商城-IC元器件在线采购平台搜集整理,浏览 了解更多详细信息)


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:TMS320F2812产品介绍

[下一篇主题]:EMIF和I/O配置方法[原创]