当前位置:文档之家› 基于ARM的嵌入式数据库研究与实现

基于ARM的嵌入式数据库研究与实现

基于ARM的嵌入式数据库研究与实现陆俊,张佳,刘宏(湖南师范大学 数学与计算机科学学院, 湖南 长沙 410081)email:lu_jun6@摘 要:ARM与uCLinux是当前非常流行的嵌入式系统组合,SQLite作为嵌入式数据库中的佼佼者,三者的结合,为各自带来了新的发展空间。

针对SQLite运用于嵌入式系统所产生的技术问题,提出了较为详实的解决方案。

关键词:嵌入式数据库;ARM;S3C44B0X;uClinux;SQLite;SkyEye1.引言32位ARM嵌入式微处理器具有高性能、低功耗的特性,已被广泛应用于消费电子产品、无线通信和网络通信等领域[1]。

uClinux是专门为没有内存管理单元MMU的微处理器设计的Linux的衍生嵌入式操作系统,内核较常规Linux小但保留了其绝大多数优点[2]。

目前国内外采用ARM-uClinux作为嵌入式系统非常普遍。

SQLite是用C语言编写的开源嵌入式数据库引擎,占用资源非常低,在嵌入式设备中,只需要几百K的内存就够了。

它能够支持Windows/Linux等主流操作系统,可与TCL、PHP、Java等程序语言相结合,提供ODBC接口,其处理速度甚至令开源世界著名的数据库管理系统Mysql、PostgreSQL望尘莫及[3]。

本文给出了在一款ARM嵌入式微处理器S3C44BOX上移植uClinux及实现SQLite的具体过程,并简要介绍了硬件模拟平台SkyEye。

2.基于S3C44B0X的uClinux的移植S3C44B0X是三星公司推出的一款基于ARM7TDMI核的16/32位RISC的嵌入式微处理器,它低功耗、高性能的设计,极其适合于对成本和功耗要求较高的应用场合。

2.1 引导程序BLOB的移植BootLoader是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。

BootLoader引导程序最基本的功能是完成CPU和存储器的硬件初始化(包括CPU的主频、SDRAM、中断、串口等) 和内核启动参数的设置并启动内核等。

BLOB(Boot Loader Object)作为一款功能强大、使用方便、可移植性好的开源BootLoader,而成为S3C44B0X开发板上非常适合uClinux的Bootloader。

(1) 在宿主机上搭建交叉编译环境编译内核与文件系统之前需要建立交叉编译环境。

从http:// www. /下载 arm-elf-tools安装在Linux宿主机上的/usr/local/bin 目录下,建立Linux机器上ARM的交叉编译环境。

BLOB和uClinux 即在此环境下编译。

(2) 下载适当的BLOB版本并安装从/tpu/下载blob-mba44b0.tgz。

这个blob-mba44b0.tgz是为一个叫mba44b0的开发板移植的BLOB,mba44b0也使用S3C44B0 作为其处理单元,所以这个1blob-mba44b0 是需要改动最少的版本。

(3) 选择适当的uClinux版本并安装在编译BLOB的时候需要uClinux的SOURCE CODE。

从/tpu/上下载uClinux-2.4.17-uc1.tgz,将它安装在宿主机上的某一个目录/path/to/armlinux/source。

(4) 修改BLOB源代码并移植参考./doc/port文件的内容,修改与具体开发板相关的源文件。

修改后,参考README 中的内容编译得到./src/blob/目录下的BLOB,即为最终需要的可以直接运行在Flash中的执行代码。

最后,将修改并编译后的BLOB通过Flash编程下载到开发板中Flash的零地址,完成BLOB的移植。

此后,便可通过这个开发板上的BLOB下载编译好的uClinux内核以及ramdisk,为uClinux的移植开发打下基础。

2.2 uClinux的移植uClinux的文件系统使用从uClinux官方网站/pub/uClinux/dist/下载的uClinux-dist-20030305.tar.gz中的文件系统部分[4]。

2.2.1 uClinux 的内核配置在编译uClinux内核之前,需要使用命令make menuconfig根据目标板对内核进行必要的配置,进行uClinux的裁减、添加或删除部分支持,主要有如下几个方面。

(1) 系统及其存储器配置在“System Type”中进行配置,该配置为板级核心配置。

(2) 通用内核选项General setup 的配置(3) 块设备Block devices 的选择和配置(4) 文件系统的选择和配置在“/proc file system support”和“Second extend fs support”中进行配置。

(5) 字符设备驱动Character devices的选择2.2.2 uClinux 的内核编译(1) 建立依赖关系:make dep(2) 编译:可以通过make或者make zImage进行编译,它们的差别在于make zImage将生成的核心进行压缩,并加入一段解压的启动代码。

Make zImage将在/uClinux-2.4.x/下生成没有压缩的内核Linux和在/uClinux-2.4.x/arch/armnommu/boot下生成压缩的内核zImage。

未进行压缩的内核大小为600KB左右,而压缩内核zImage大小在300KB左右。

zImage将通过Flash编程被下载到Flash中的64K地址处。

下面的关键是生成uClinux的根文件系统。

2.2.3 uClinux文件系统的生成将下载的uClinux-dist-20030305.tar.gz解压缩到宿主机上的某个目录下,配置编译这个uClinux-dist 中的文件系统。

在./uClinux-dist/目录下依次运行make menuconfig;make clean;make dep;make lib_only;make user_only;和make romf,最终生成几百KB大小的romfs.img即为所需的文件系统。

22.2.4 在开发板上运行uClinux给开发板加电,系统自动运行BLOB。

超级终端或者minicom显示了BLOB运行的信息,然后回车进入命令行状态,得到提示符blob>,用xdownload kernel下载zImage。

下载结束后,用xdownload ramdisk下载romfs.img。

都结束后运行blob>boot,出现starting kernel,然后便是UncompressingLinux........ done,booting the kernel。

内核开始启动,在启动的最后便是uClinux的欢迎信息和shell提示符。

3. uClinux下嵌入式数据库SQLite的实现3.1 SQLite的内部结构SQLite 对SQL92 标准的支持包括索引、限制、触发和查看,支持原子的、一致的、独立和持久(ACID)的事务[5]。

在内部,SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件,如图(1)。

SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。

所有SQL语句都被编译成易读的、可以在SQLite 虚拟机中执行的程序集。

图(1) SQLite的内部结构两个先进的开源数据库抽象层对SQLite 提供支持:PEAR::DB,它们包含在 PHP V5 中。

通过预先使用 PHP 扩展和应用程序库(PEAR),可将SQLite用于应用程序的快速复原,在以后需要时,可以将其无缝转向更具工业性质的数据库。

3.2 sqlite的移植通过上述各步,已经能够正确编译uclinux的kernel。

在移植sqlite前,应能参照“uClinux-dist/Documentation/Adding-User-Apps-HOWTO”中所描述的“用户程序的订制”的内容,完成将自己写的类似helloworld程序加到“用户自定义应用程序”中。

33.2.1 下载并解压sqlite从/download.html下载sqlite-2.8.15.tar.gz软件包,并解压缩到uClinux-dist/user目录下,以便将sqlite编译成一个普通的用户应用程序:tar zxvf sqlite-2.8.15.tar.gz –C uClinux-dist/user/3.2.2 SQLite作为用户应用程序的相关设置按uClinux-dist/Documentation/Adding-User-Apps-HOWTO文档中说述,添加sqlite作为一个用户应用程序。

编辑文件uClinux-dist/user/MakefileuClinux-dist/config/Configure.helpuClinux-dist/config/config.in在这些文件里查找与“CPU”有关的项,然后在它的下面,加上sqlite项。

运行 uClinux的make menuconfig,选中“CustomizeVendor/User Settings”,“Miscellaneous Applications”,即出现了刚添加进去的SQLite项“sqlite (NEW)”。

在稍后的make romfs中,uClinux会将sqlite编译进来,做成romfs的一部分,这样在移植后的uclinux的/bin目录中将会有sqlite命令可以执行。

3.2.3 sqlite的修改添加、修改以下几个文件,完成sqlite在uClinux下的编译,简要介绍如下:(1) 修改sqlite/main.mk去掉make install项,加上make romfs项,这将在romfs的/bin目录下生成sqlite。

romfs: sqlite$(ROMFSINST) /bin/sqlite(2) 在sqlite下增加Makefile文件以sqlite/Makefile.linux-gcc文件为蓝本,写一个合适的Makefile(3) 修改sqlite/src/os.c将所有 if (s!=0) 修改为 if (s!=0 $$ errno!=ENOSYS)(4) 修改sqlite/src/shell.c完成修改,再依次运行make dep;make lib_only;make user_only;make romfs;make image,即在uClinux-dist/images下编译生成了包含有sqlite的romfs文件系统。

相关主题