版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式開發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫(kù)技術(shù)引言1Linux下常見的數(shù)據(jù)庫(kù)技術(shù)分析(1)PostgreSQL(2)MySQL(3)mSQL(miniSQL)(4)BerkeleyDB(5)SQLite2嵌入式開發(fā)對(duì)數(shù)據(jù)庫(kù)的需求特點(diǎn)3SQLite的體系結(jié)構(gòu)及開發(fā)技術(shù)3.1體系結(jié)構(gòu)3.2SQLite開發(fā)技術(shù)4SQLite在armLinux平臺(tái)上的實(shí)現(xiàn)5SQLite的應(yīng)用開發(fā)6總結(jié)隨著嵌入式系統(tǒng)的廣泛應(yīng)用和用戶對(duì)數(shù)據(jù)處理和管理需求的不斷提高,各種智能設(shè)備和數(shù)據(jù)庫(kù)技術(shù)的緊密結(jié)合已經(jīng)得到了各方面的重視。不久的將來(lái)嵌入式數(shù)據(jù)庫(kù)將無(wú)處不在。縱觀目前國(guó)際、國(guó)內(nèi)嵌入式數(shù)據(jù)庫(kù)的應(yīng)用情況,目前基于嵌入式數(shù)據(jù)庫(kù)應(yīng)用的市場(chǎng)已經(jīng)進(jìn)入加速發(fā)展的階段。引言基于Linux平臺(tái)的數(shù)據(jù)庫(kù)非常多,大型的商用數(shù)據(jù)庫(kù)有Oracle、Sybase、Informix、Informix、IBMDB2等;中小型的更是不勝枚舉,以下是常見的幾種。1嵌入式開發(fā)教程Linux下常見的數(shù)據(jù)庫(kù)技術(shù)分析PostgreSQL是世界上最優(yōu)秀的開放源碼的數(shù)據(jù)庫(kù)之一,是完全免費(fèi)的數(shù)據(jù)庫(kù),不需要任何版權(quán)費(fèi)用和購(gòu)買費(fèi)。因此,它是許多Linux發(fā)行版本的首選,例如:Redhat、TurboLinux都預(yù)裝了PostgreSQL。PostgreSQL兼容性很強(qiáng),如果是SQL92兼容的,移植PostgreSQL非常簡(jiǎn)單和快捷。(1)嵌入式開發(fā)教程PostgreSQLMySQL是多用戶、多進(jìn)程的SQLdatabaseserver。MySQL包括一個(gè)serverdaemon(mysqld)和clientprograms與libraries的client/server實(shí)現(xiàn)工具;比較適合小而簡(jiǎn)單的數(shù)據(jù)庫(kù),對(duì)復(fù)雜的操作要求支持不是很好。MySQL的licensingpolicy:如果你是普通的最終用戶,使用MySQL不需要付錢;但如果是直接或間接地出售MySQL的服務(wù)程序或相關(guān)產(chǎn)品,或是在一些客戶端維護(hù)MySQLserver并收取費(fèi)用,或是在發(fā)行版中包括MySQL,就需要獲得許可。
*本課題是2003年河南省杰出人才創(chuàng)新基金項(xiàng)目(0321000300),獲得了河南省科技廳的資金支持。(2)嵌入式開發(fā)教程MySQLmSQL是一個(gè)單用戶數(shù)據(jù)庫(kù)管理系統(tǒng)。由于它的短小精悍,使其開發(fā)的應(yīng)用系統(tǒng)特別受到互聯(lián)網(wǎng)用戶青睞。mSQL并非是完全的freeware,若是在大學(xué)中使用此一軟件,或是為了學(xué)術(shù)研究與慈善等非營(yíng)利性目的,才能免費(fèi)得到使用權(quán)(freelicense),否則就得付費(fèi)注冊(cè)才能得到正式的版權(quán)。(3)嵌入式開發(fā)教程mSQL(miniSQL)BerkeleyDB是一個(gè)開放源代碼的嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng),能夠?yàn)閼?yīng)用程序提供高性能的數(shù)據(jù)管理服務(wù)。應(yīng)用它,程序員只需要調(diào)用一些簡(jiǎn)單的API就可以完成對(duì)數(shù)據(jù)的訪問和管理。與常用的數(shù)據(jù)庫(kù)管理系統(tǒng)(如MySQL和Oracle等)有所不同,在BerkeleyDB中并沒有數(shù)據(jù)庫(kù)服務(wù)器的概念。應(yīng)用程序不需要事先同數(shù)據(jù)庫(kù)服務(wù)建立起網(wǎng)絡(luò)連接,而是通過內(nèi)嵌在程序中的BerkeleyDB函數(shù)庫(kù)來(lái)完成對(duì)數(shù)據(jù)的保存、查詢、修改和刪除等操作。(4)嵌入式開發(fā)教程BerkeleyDBSQLite支持絕大多數(shù)標(biāo)準(zhǔn)的SQL92語(yǔ)句,采用單文件存放數(shù)據(jù)庫(kù),速度又比MySQL快上1~2倍(官方的數(shù)據(jù)),存儲(chǔ)量也不是問題。在操作語(yǔ)句上更類似關(guān)系型數(shù)據(jù)庫(kù)的產(chǎn)品使用,非常方便。SQLite的版權(quán)允許無(wú)任何限制的應(yīng)用,包括商業(yè)性的產(chǎn)品。在PHP5中已經(jīng)集成了這個(gè)輕巧的嵌入式數(shù)據(jù)庫(kù)產(chǎn)品。(5)嵌入式開發(fā)教程SQLite在眾多的數(shù)據(jù)庫(kù)中,如何選擇適用于嵌入式系統(tǒng)的數(shù)據(jù)庫(kù)呢?嵌入式系統(tǒng)開發(fā)環(huán)境決定了其對(duì)數(shù)據(jù)庫(kù)需求的特點(diǎn)。(1)適當(dāng)?shù)捏w積嵌入式系統(tǒng)對(duì)于數(shù)據(jù)的存儲(chǔ)與程序的運(yùn)行一般都有較強(qiáng)的空間限制,所以適用于嵌入式系統(tǒng)使用的數(shù)據(jù)庫(kù)首先應(yīng)該有一個(gè)適當(dāng)?shù)捏w積。(2)較強(qiáng)的功能嵌入式開發(fā)中有很多應(yīng)用,用戶需求決定了開發(fā)中需要有一個(gè)大小適中且功能齊備的數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的管理。對(duì)開發(fā)人員來(lái)說,要求采用的數(shù)據(jù)庫(kù)技術(shù)提供完備開發(fā)的文檔而且易于開發(fā)。(3)開源的代碼作為產(chǎn)品的開發(fā),開源的代碼不僅可以減少產(chǎn)品的生產(chǎn)成本,更重要的是為產(chǎn)品的維護(hù)完善和穩(wěn)定運(yùn)行都提供了最為徹底的解決手段。2嵌入式開發(fā)對(duì)數(shù)據(jù)庫(kù)的需求特點(diǎn)上面介紹的數(shù)據(jù)庫(kù)技術(shù)中,Oracle、Sybase、Informix、IBMDB2等功能強(qiáng)大,系統(tǒng)體積龐大,要求付費(fèi)使用,僅適用于作為大型商業(yè)數(shù)據(jù)庫(kù)。MySQL在保持中等體積的情況下,提供了較為適用的功能已經(jīng)成為中小規(guī)模數(shù)據(jù)庫(kù)應(yīng)用的首選,但商業(yè)應(yīng)用也要收費(fèi),而且對(duì)于嵌入式開發(fā)來(lái)說空間占用仍然太大,目前還不適用。
mSQL是一種簡(jiǎn)化的SQL數(shù)據(jù)庫(kù),短小精悍,開發(fā)方便,適用于嵌入式開發(fā);但mSQL只有30天的使用期限,并非完全的開源。余下的開放源碼數(shù)據(jù)庫(kù)中,PostgreSQL是Linux下最完善的開源SQL數(shù)據(jù)庫(kù),但體積也較大。BerkeleyDB作為完全開源的嵌入式數(shù)據(jù)庫(kù)速度極快,可靠性高;但學(xué)習(xí)起來(lái)有一定難度,必然會(huì)加大開發(fā)成本。
SQLite則簡(jiǎn)單易用,速度也很快,同時(shí)提供了豐富的數(shù)據(jù)庫(kù)接口,功能雖較BerkeleyDB略有遜色,但在開源社區(qū)的推動(dòng)下差距正在縮小。它的設(shè)計(jì)思想是小型、快速和最小化的管理。這對(duì)于需要一個(gè)數(shù)據(jù)庫(kù)用于存儲(chǔ)數(shù)據(jù),但又不想花太多時(shí)間來(lái)調(diào)整數(shù)據(jù)性能的開發(fā)人員很適用。實(shí)際上在很多情況下,并不需要存儲(chǔ)程序或復(fù)雜的表之間的關(guān)聯(lián)。這時(shí)會(huì)發(fā)現(xiàn)SQLite在大小和功能之間找到了一個(gè)理想的平衡點(diǎn)。完全的開源代碼使其可以稱得上是理想的“嵌入式數(shù)據(jù)庫(kù)”。嵌入式開發(fā)教程SQLite是D·理查德·希普開發(fā)出來(lái)的用一個(gè)小型C庫(kù)實(shí)現(xiàn)的一種強(qiáng)有力的嵌入式關(guān)系數(shù)據(jù)庫(kù)管理體制。它提供了對(duì)SQL92的大多數(shù)支持:支持多表和索引、事務(wù)、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動(dòng)。這個(gè)庫(kù)有很強(qiáng)的內(nèi)聚性,通過不到25000行的ANSIC代碼實(shí)現(xiàn),而且可以自由地應(yīng)用于任何目的甚至包括商業(yè)應(yīng)用。此外它還是高速、有效和可升級(jí)的,可以運(yùn)行于從arm/Linux到SPARC/Solaris的多種硬件平臺(tái)。3嵌入式開發(fā)教程SQLite的體系結(jié)構(gòu)及開發(fā)技術(shù)圖1SQLite體系結(jié)構(gòu)SQLite有一種優(yōu)雅、標(biāo)準(zhǔn)化的設(shè)計(jì)。它可以分成8個(gè)主要子系統(tǒng),如圖1所示,其中有一些相當(dāng)接近于關(guān)系數(shù)據(jù)庫(kù)管理。在圖1的頂層是標(biāo)記處理器(tokenizer)和分析器(parser)。SQLite有自己高度優(yōu)化的分析生成器(檸檬分析器),可以快速地生產(chǎn)出高效率的代碼,而且依靠它新穎的設(shè)計(jì)對(duì)內(nèi)存泄漏有著特別的抵抗力。在底部是基于Knuth經(jīng)過優(yōu)化的B樹。這樣可以運(yùn)行在可調(diào)整的頁(yè)面緩沖(pagecache)上,有助于將對(duì)磁盤的查找減到最小。再往下是頁(yè)面高速緩存。它作用在OS的抽象層之上,這樣的安排有助于數(shù)據(jù)庫(kù)的移動(dòng)。體系結(jié)構(gòu)的核心是虛擬數(shù)據(jù)庫(kù)引擎(VDBE)。VDBE完成與數(shù)據(jù)操作相關(guān)的全部操作并且是客戶和儲(chǔ)存之間信息進(jìn)行交換的中間單元。從各個(gè)方面來(lái)看,它都是SQLite的核心。在SQL語(yǔ)句被分析之后,VDBE開始起作用。代碼生成器將分析樹翻譯成一個(gè)袖珍程序,隨后這些袖珍程序又被組合成用VDBE的虛擬機(jī)器語(yǔ)言表示的一系列指令。如此往復(fù),VDBE執(zhí)行每條指令,最終完成SQL語(yǔ)句指定的查詢要求。3.1嵌入式開發(fā)教程體系結(jié)構(gòu)VDBE的機(jī)器語(yǔ)言由圍繞于數(shù)據(jù)庫(kù)管理128個(gè)操作碼(opcode)組成。對(duì)于打開表,查詢索引、存儲(chǔ)和刪除記錄和很多其他數(shù)據(jù)庫(kù)操作都有對(duì)應(yīng)的操作碼。在VDBE里的每條指令由1個(gè)操作碼和3個(gè)操作數(shù)(operand)組成。一些指令使用全部(3個(gè))操作數(shù);也有些可能一個(gè)也未使用。這完全取決于指令的性質(zhì)。例如Open指令,用于打開一個(gè)表的指針,使用了全部(3個(gè))操作數(shù):第1個(gè)操作數(shù)(P1)包含指針的ID號(hào)。第2操作數(shù)(P2)指出表的根位置(或者表的首頁(yè)位置);而第3個(gè)操作數(shù)則是表的名字。對(duì)于Rollback指令則根本不需要操作數(shù)。為了進(jìn)行一次RollbackVDBE,僅需知道是否要做Rollback\[1\]。嵌入式開發(fā)教程SQLite的API極其易于使用,只需要三個(gè)用來(lái)執(zhí)行SQL和獲得數(shù)據(jù)的函數(shù)。它還是可以擴(kuò)展的,允許程序員自定義函數(shù)然后以callback的形式集合進(jìn)去。C語(yǔ)言API是腳本接口的基礎(chǔ),如已經(jīng)發(fā)布的(Tcl接口)。開放源碼團(tuán)體已經(jīng)擴(kuò)展了眾多的客戶接口、適配器、驅(qū)動(dòng)等,這就使得其他語(yǔ)言對(duì)SQLite的使用也成為可能。使用C語(yǔ)言API只需要三步。首先,要提供文件名和訪問模式用來(lái)調(diào)用sqlite_open()連接數(shù)據(jù)庫(kù)。然后,執(zhí)行一個(gè)callback函數(shù),SQLite通過對(duì)每個(gè)記錄執(zhí)行callback函數(shù)獲得從數(shù)據(jù)庫(kù)那里得到的結(jié)果。最后,如果想執(zhí)行一個(gè)SQL查詢并獲得一個(gè)callback函數(shù)的指針,可以調(diào)用sqlite_exec()。除此之外還需要錯(cuò)誤代碼檢查。SQLite可以通過對(duì)一個(gè)主鍵聲明它為INTEGERPRIMARYKEY成為能夠自動(dòng)增加的主鍵,實(shí)現(xiàn)自增字段。
SQLite還提供了存取二進(jìn)制大對(duì)象(BLOBs)的方法,在線程安全、數(shù)據(jù)庫(kù)管理、API的擴(kuò)展等方面也都提供了強(qiáng)大方便的技術(shù)支持。3.2嵌入式開發(fā)教程SQLite開發(fā)技術(shù)SQLite嵌入式數(shù)據(jù)庫(kù)提供了以源碼發(fā)布的方式,要在眾多的硬件平臺(tái)進(jìn)行移植,可以根據(jù)不同平臺(tái)對(duì)源碼進(jìn)行交叉編譯來(lái)實(shí)現(xiàn)。編譯主要有以下幾個(gè)步驟\[2\]:
①到/的cvs中下載最新的源代碼包,解壓后將生成sqlite目錄,另外新建并轉(zhuǎn)到一個(gè)與sqlite目錄平行的同級(jí)目錄,如make目錄。
②用“echo$PATH”命令查看PATH中是否已經(jīng)包含交叉編譯工具armlinuxgcc。
③為了在ARMLinux下能正常運(yùn)行sqlite,需要對(duì)sqlite/src/sqliteInt.h作一定的修改,以確保btree(B樹)有正確的變量大小,如“ptr”和“char*”。不同體系結(jié)構(gòu)的Linux,如x86和ARM,會(huì)有些差別。對(duì)于armLinux可以找到如下部分:#ifndefINTPTR_TYPE
#ifSQLITE_PTR_SZ==44嵌入式開發(fā)教程SQLite在armLinux平臺(tái)上的實(shí)現(xiàn)
#defineINTPTR_TYPEint
#else
#defineINTPTR_TYPElonglong
#endif在上面的代碼前加上一句#defineSQLITE_PTR_SZ4這樣后面的“typedefINTPTR_TYPEptr;”就是定義的“int”類型,而不是“l(fā)onglong”。
④使用configure進(jìn)行一些配置。修改sqlite目錄下的configure,讓configure不去檢查交叉編譯環(huán)境。由于篇幅有限不再詳述。
⑤修改Makefile文件。將代碼行BCC=armlinuxgccgO2改成BCC=gccgO2。另外,一般是以靜態(tài)鏈接的形式將sqlite放到armLinux的硬件板上運(yùn)行的,所以繼續(xù)修改Makefile,找到標(biāo)記為sqlite:的代碼段,將其中的libsqlite.la改成.libs/libsqlite.a。做完上述修改,用make生成sqlite、libsqlite.a、libsqlite.so。為了減小執(zhí)行文件大小可以用strip處理,去掉其中的調(diào)試信息。嵌入式開發(fā)教程
⑥在ARM板上運(yùn)行sqlite。將sqlite拷貝到arm板上,方法很多,需要根據(jù)具體的情況來(lái)選擇。如ftp、cmdftp、wget等。將sqlite下載到arm板的/tmp目錄,因?yàn)榇四夸浭强蓪懙摹P薷臋?quán)限并運(yùn)行:chmod+wxsqlite
./sqlitetest.sqlite會(huì)出現(xiàn)sqlite>如果一切正常,現(xiàn)在sqlite已經(jīng)在armLinux下跑了起來(lái),然后就可以基于此進(jìn)行進(jìn)一步的應(yīng)用開發(fā)了。嵌入式開發(fā)教程家庭網(wǎng)絡(luò)中央控制器以arm微處理器為中心建立硬件平臺(tái),對(duì)外通過寬帶Ethernet、Modem與Internet連接,對(duì)內(nèi)將家用電器通過內(nèi)部無(wú)線局域網(wǎng)連接成一體,通過遠(yuǎn)程Web瀏覽器、本地觸摸屏以及電話語(yǔ)音三種方式實(shí)現(xiàn)對(duì)家用電器的狀態(tài)查詢和控制。多樣化的數(shù)據(jù)存儲(chǔ)與管理需要有一個(gè)后臺(tái)數(shù)據(jù)庫(kù)來(lái)支撐,SQLite無(wú)疑是一個(gè)合適的選擇。下面就其應(yīng)用程序的編寫方式作一個(gè)簡(jiǎn)單的介紹。為了講解方便,下面例程通過程序代碼生成了數(shù)據(jù)庫(kù)sysdb及其中的一個(gè)表格user,也可以用sqlite命令行或者sqlitebrowse等圖形化工具建立數(shù)據(jù)庫(kù)。
#include<string.h>
#include"sqlite.h"
intcallback(void*p_data,intnum_fields,char**p_fields,
char**p_col_names);5嵌入式開發(fā)教程SQLite的應(yīng)用開發(fā)
main(){
FILE*inp_fp;
intret;
intnrecs=0;
char*errmsg;
sqlite*p_db;
unsignedchar*sqlcommand;
unsignedchar*sqlcreatedb;
sqlcommand="select*fromuser;";
sqlcreatedb="createtableuser(idnumeric,nametext);";
/*建立數(shù)據(jù)庫(kù)*/
if((inp_fp=fopen("./sysdb","r"))==NULL){
printf("Cannotfinddatabasefile!\\n");嵌入式開發(fā)教程
printf("Recoverthedatabasefile...\\n");
p_db=sqlite_open("./sysdb",0777,0);
sqlite_exec(p_db,sqlcreatedb,0,0,0);
printf("Thedatabasefilehavebeenrecorvered!\\n");
sqlite_close(p_db);
}
/*打開數(shù)據(jù)庫(kù)*/
sqlite*p_db=sqlite_open("./sysdb",0777,0);
/*選擇user表中的所有記錄.*/
ret=sqlite_exec(p_db,sqlcommand,callback,&nrecs,
errmsg);嵌入式開發(fā)教程
if(ret!=SQLITE_OK){
printf("Error
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2021高考英語(yǔ)四川岳池縣教研室統(tǒng)練(11)及答案-閱讀類
- 《創(chuàng)新服務(wù)方式》課件
- 2025年人教版八年級(jí)數(shù)學(xué)寒假預(yù)習(xí) 第07講 平行四邊形的性質(zhì)(3個(gè)知識(shí)點(diǎn)+4大考點(diǎn)舉一反三+過關(guān)測(cè)試)
- 2025年人教版七年級(jí)數(shù)學(xué)寒假?gòu)?fù)習(xí) 專題06 幾何圖形初步(3重點(diǎn)串講+17考點(diǎn)提升+過關(guān)檢測(cè))
- 【名師金典】2022新課標(biāo)高考生物總復(fù)習(xí)限時(shí)檢測(cè)9ATP與細(xì)胞呼吸-
- 【高考復(fù)習(xí)方案】2021屆高考語(yǔ)文一輪復(fù)習(xí)作業(yè)答案(新課標(biāo)-廣東省專用)
- 八年級(jí)歷史電子書
- 《醫(yī)學(xué)倫理討論會(huì)》課件
- 【狀元之路】2022高考地理總復(fù)習(xí)開卷速查18城市化-
- 【優(yōu)化探究】2022屆高三物理一輪復(fù)習(xí)知能檢測(cè):3-3牛頓運(yùn)動(dòng)定律的綜合應(yīng)用-
- 2024-2025學(xué)年冀教新版八年級(jí)上冊(cè)數(shù)學(xué)期末復(fù)習(xí)試卷(含詳解)
- DB45T 1831-2018 汽車加油加氣站防雷裝置檢測(cè)技術(shù)規(guī)范
- 《兒歌運(yùn)用于幼兒園教育問題研究的文獻(xiàn)綜述》8600字
- 懸掛燈籠施工方案
- 水資源調(diào)配與優(yōu)化-洞察分析
- 某自來(lái)水公司自然災(zāi)害應(yīng)急預(yù)案樣本(2篇)
- 2024-2025學(xué)年語(yǔ)文二年級(jí)上冊(cè) 統(tǒng)編版期末測(cè)試卷(含答案)
- 2024-2025年江蘇專轉(zhuǎn)本英語(yǔ)歷年真題(含答案)
- 屋頂光伏發(fā)電項(xiàng)目EPC工程總承包售后服務(wù)保證措施
- 影視制作技能薪酬激勵(lì)
- 第四屆全省職業(yè)技能大賽技術(shù)文件-工業(yè)控制樣題
評(píng)論
0/150
提交評(píng)論