当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > TN0030_SylixOS伯克利数据库移植

TN0030_SylixOS伯克利数据库移植 时间:2018-09-28      来源:未知

修订历史

版本 日期 原因

V1.00 2017/02/03 创建文档

目  录

1. DB数据库简介 1

2. 移植思路 1

3. 移植实现 1

3.1 在Linux下生成配置文件 1

3.2 移植到SylixOS 2

3.2.1 创建SylixOS工程 2

3.2.2 参考Linux下的Makefile修改SylixOS的Makefile 2

3.2.3 修改编译错误 4

3.2.4 测试DB数据库 4

4. 移植总结 6

4.1 移植流程 6

4.2 移植原则 6

1. DB数据库简介

Berkeley DB(DB)是历史悠久的嵌入式数据库系统,主要应用在UNIX/LINUX操作系统上,其设计思想是简单、小巧、可靠、高性能。

DB是一个高性能的,嵌入数据库编程库,和C语言,C++,Java,Perl,Python,PHP,Tcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持大256TB的数据,广泛用于各种操作系统包括大多数Unix类操作系统和Windows操作系统以及实时操作系统。

2. 移植思路

移植Linux中间件到SylixOS上的思路请参考《TN0029_SylixOS第三方中间件移植方法》。

3. 移植实现

在伯克利的官方网站上下载伯克利的DB数据库的源码,选择的版本是4.7.25(官方网址//www.oracle.com/database/berkeley-db/index.html)。

3.1 在Linux下生成配置文件

把官网下载的源码在Linux环境下编译执行,产生配置文件。

1. 把源码工程导入到Ubuntu里进行解压缩;

2. 在db-4.7.25下新建一个build_arm目录,输入指令../dist/configure CC=arm-linux-gcc进行配置。在build_arm目录下产生配置文件和Makefile。

 

这样在Linux环境下生成了配置文件,然后把整个源码包导出。

3.2 移植到SylixOS

把源码工程导入到RealEvo-IDE开发环境上进行开发编译。

3.2.1 创建SylixOS工程

在SylixOS开发环境RealEvo-IDE中创建一个动态库工程libdb,把有配置文件的db源码拷贝到工程下的src目录。

 

为了不破坏源码工程的结构,移植需要手动修改Makefile,设置工程属性为专家模式。

 

3.2.2 参考Linux下的Makefile修改SylixOS的Makefile

打开Linux下的Makefile,找到编译需要依赖哪些*.c文件。

 

根据Makefile上C_OBJS找到具体依赖的*.c文件。

 

根据Linux下的Makefile手动修改IDE上libdb工程的libdb.mk文件。

 

3.2.3 修改编译错误

对libdb工程进行编译,会有关于头文件无效错误提示,修改原文件的头文件。

 

修改文件依赖的头文件名格式后,仍有一处错误。

 

在mutex_int.h文件中有个关于LOAD_ACTUAL_MUTEX_CODE这个宏未定义,在Makefile中定义。这个宏功能为:打开ARM/gcc的一个关于互斥锁的汇编代码。

修改过后编译成功,生成libdb.so文件导入虚拟机中。

3.2.4 测试DB数据库

编写测试代码,测试代码如程序清单 3 1所示。

程序清单 3 1 DB数据库测试代码

#include <stdio.h>

#include <db.h>

#include <string.h>

 

#define DESCRIPTION_SIZE 20

int main() {

DB        *dbp;                                                 /* DB structure handle */

u_int32_t  flags;                                               /* database open flags */

int        ret;                                                 /* function return value */

char      *description = "Grocery bill.";

char      *description1[DESCRIPTION_SIZE + 1];

DBT        key, data;

float      money;

/* Initialize the structure. This

* database is not opened in an environment,

* so the environment pointer is NULL. */

ret = db_create(&dbp, NULL, 0);

if (ret != 0) {                                            /* Error handling goes here */

printf("Create fail!\n");

return -1;

}

                                                                /* Database open flags */

flags = DB_CREATE;                                                /* If the database does not exist,create it.*/

                                                                /* open the database */

ret = dbp->open(dbp,                                              /* DB structure pointer */

               NULL,                                            /* Transaction pointer */

               "/apps/db_test/my_db.db",                         /* On-disk file that holds the database. */

               NULL,                                            /* Optional logical database name */

               DB_BTREE,                                        /* Database access method */

               flags,                                           /* Open flags */

               0);                                              /* File mode (using defaults) */

if (ret != 0) {                                            /* Error handling goes here */

printf("Created new database.\n");

}

money = 122.45;

/* Zero out the DBTs before using them. */

memset(&key, 0, sizeof(DBT));

memset(&data, 0, sizeof(DBT));

key.data = &money;

key.size = sizeof(float);

 

data.data = description;

data.size = strlen(description) + 1;

 

ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE);

if (ret == DB_KEYEXIST) {

dbp->err(dbp, ret, "Put failed because key %f already exists", money);

}

memset(&data, 0, sizeof(DBT));

data.data = &description1;

data.ulen = DESCRIPTION_SIZE + 1;

data.flags = DB_DBT_USERMEM;

dbp->get(dbp, NULL, &key, &data, 0);

printf("data: %s\n", (char *) data.data);

/* When we're done with the database, close it. */

if (dbp != NULL)

dbp->close(dbp, 0);

return 0;

}

测试产生一个DB数据库,并且从数据库中读取数据“Grocery bill.”。

4. 移植总结

4.1 移植流程

移植流程如下:

1. 在官网下载源码;

2. 在Linux下运行实现功能;

3. 一般中间件网络上有移植笔记,可参考;

4. 在Linux下利用configure功能产生配置文件(配置文件configure.h和Makefile等很重要);

5. 参考Makefile修改IDE的工程****.mk文件(主要知晓中间件依赖的源文件);

6. 在移植过程中请做好移植记录,以便查询修改信息;

7. 如有修改或者添加功能实现请新建文件。

4.2 移植原则

移植原则如下:

1. 做减法,先裁剪留出主要功能;

2. 不修改内核源码,如有功能SylixOS暂未实现,可根据功能语义编写功能函数或该功能非主要可裁剪掉。

在移植编译过程中会出现各种错误,需要细心的根据错误信息查找错误位置,在根据SylixOS功能进行修改实现。

上一篇:ucGUI在SylixOS下的应用

下一篇:TN0015_fork函数替换为SylixOS进程

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部