修訂歷史
版本 日期 原因
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功能進行修改實現。