共計 3621 個字符,預計需要花費 10 分鐘才能閱讀完成。
這篇文章主要為大家展示了“SylixOS 如何移植 DB 數據庫”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“SylixOS 如何移植 DB 數據庫”這篇文章吧。
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(官方網址 http://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,如圖 3- 1 所示。
圖 3-1
生成的配置文件和 Makefile
這樣在 Linux 環境下生成了配置文件,然后把整個源碼包導出。
3.2. 移植到 SylixOS
把源碼工程導入到 RealEvo-IDE 開發環境上進行開發編譯。
3.2.1. 創建 SylixOS 工程
在 SylixOS 開發環境 RealEvo-IDE 中創建一個動態庫工程 libdb,把有配置文件的 db 源碼拷貝到工程下的 src 目錄,如圖
3- 2 所示。
圖 3-2
libdb 工程
為了不破壞源碼工程的結構,移植需要手動修改 Makefile,設置工程屬性為專家模式,如圖 3- 3 所示。
圖 3-3
設置專家模式
3.2.2. 參考 Linux 下的 Makefile 修改 SylixOS 的 Makefile
打開 Linux 下的 Makefile,找到編譯需要依賴哪些 *.c 文件,如圖 3- 4 所示。
圖 3-4 Linux 下 Makefile
根據 Makefile 上 C_OBJS 找到具體依賴的 *.c 文件,如圖 3- 5 所示。
圖 3-5
DB 數據庫依賴的原文件
根據 Linux 下的 Makefile 手動修改 IDE 上 libdb 工程的 libdb.mk 文件,如圖 3- 6 所示。
圖 3-6
手動修改 IDE 的 Makefile
3.2.3. 修改編譯錯誤
對 libdb 工程進行編譯,會有關于頭文件無效錯誤提示,修改原文件的頭文件,如圖 3- 7 所示。
圖 3-7 修改頭文件名的格式
修改文件依賴的頭文件名格式后,仍有一處錯誤,如圖 3- 8 所示。
圖 3-8
出現的匯編錯誤
在 mutex_int.h 文件中有個關于 LOAD_ACTUAL_MUTEX_CODE 這個宏未定義,在 Makefile 中定義。這個宏功能為:打開 ARM/gcc 的一個關于互斥鎖的匯編代碼,如圖
39 所示。
圖 3-9 Makefile 中定義宏
修改過后編譯成功,生成 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;
}
程序運行現象如圖 3-10 所示。
圖 3-10
測試現象
測試產生一個 DB 數據庫,并且從數據庫中讀取數據 Grocery bill.。
4. 移植總結 4.1. 移植流程
移植流程如下:
在官網下載源碼;
在 Linux 下運行實現功能;
一般中間件網絡上有移植筆記,可參考;
在 Linux 下利用 configure 功能產生配置文件(配置文件 configure.h 和 Makefile 等很重要);
參考 Makefile 修改 IDE 的工程 ****.mk 文件(主要知曉中間件依賴的源文件);
在移植過程中請做好移植記錄,以便查詢修改信息;
如有修改或者添加功能實現請新建文件。
4.2. 移植原則
移植原則如下:
做減法,先裁剪留出主要功能;
不修改內核源碼,如有功能 SylixOS 暫未實現,可根據功能語義編寫功能函數或該功能非主要可裁剪掉。
在移植編譯過程中會出現各種錯誤,需要細心的根據錯誤信息查找錯誤位置,在根據 SylixOS 功能進行修改實現。
以上是“SylixOS 如何移植 DB 數據庫”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!