色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 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號

回到頂部

主站蜘蛛池模板: 亚洲阿V天堂网2019无码 | 色婷婷五月综合亚洲小说 | 4HU四虎永久免费地址WW416 | 1000部啪啪未满十八勿入不卡 | 在线视频日本 | 久久SE精品一区精品二区国产 | 风间由美乳巨码无在线 | 国产欧美日韩视频在线观看 | 久久国产福利国产秒拍 | 国产欧美日韩在线观看视频 | 一本一道AV无码中文字幕﹣百度 | 女邻居的大乳中文字幕 | 日本丰满人要无码视频 | 亚洲色WWW成人永久网址 | 亚洲av产在线精品亚洲第一站 | 久久精品私人影院免费看 | 日本乱码一区二区三区高清在线观看 | 精品亚洲国产成人AV | 久久e热在这里只有精品99 | 精品粉嫩BBWBBZBBW | 激情av在线播放 | 俄罗斯老熟妇乱子伦视频 | 夫妻的情妇在线观看 | 波多野结衣与黑人AV | 在线观看av你懂的 | 日韩美女在线观看一区 | 粉嫩大学生无套内射无码卡视频 | 日产乱码一二三区别免费一 | 手机久草视频分类在线观看 | 国产熟妇的荡欲午夜视频 | 国产伦国产伦老熟300部 | 久久人搡人人玩人妻精品首页 | 中文字幕の友人北条麻妃 | 久久婷婷人人澡人人喊人人爽 | 无码熟熟妇丰满人妻啪啪软件 | 啪啪无码人妻丰满熟妇 | 好了av四色综合无码 | 激情亚洲一区国产精品 | 99久久精品国产欧美主题曲 | 97午夜理论片影院在线播放 | 国产超碰AV人人做人人爽 |