引 言
隨著嵌入式系統(tǒng)的廣泛應(yīng)用及用戶對數(shù)據(jù)處理和管理需求的不斷提高,各種智能設(shè)備與數(shù)據(jù)庫技術(shù)的緊密結(jié)合得到重視,。這種數(shù)據(jù)庫不僅具有傳統(tǒng)數(shù)據(jù)庫的主要功能,,還具有嵌入式和支持移動技術(shù)兩種特性??梢哉f,,嵌入式數(shù)據(jù)庫的發(fā)展提高了數(shù)據(jù)信息接入的普遍性,使人們隨時隨地獲取信息的愿望成為可能,。
1 嵌入式數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu)
嵌入式數(shù)據(jù)庫將數(shù)據(jù)庫系統(tǒng)與操作系統(tǒng)和具體應(yīng)用集成在一起,,運行在各種智能嵌入式設(shè)備上。與傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)相比,,它一般體積較小,,有較強的便攜性和易用性,以及較為完備的功能來實現(xiàn)用戶對數(shù)據(jù)的管理操作,。但是,,由于嵌入式系統(tǒng)的資源限制,它無法作為一個完整的數(shù)據(jù)庫來提供大容量的數(shù)據(jù)管理,,而且嵌入式設(shè)備可隨處放置,,受環(huán)境影響較大,數(shù)據(jù)可靠性較低。在實際應(yīng)用中,,為了彌補嵌入式數(shù)據(jù)庫存儲容量小,、可靠性低的不足,通常在PC機上配置后臺數(shù)據(jù)庫來實現(xiàn)大容量數(shù)據(jù)的存儲和管理,。嵌入式數(shù)據(jù)庫作為前端設(shè)備,,需要一個GUI交互界面來實現(xiàn)嵌入式終端上的人機交互,并通過串口實現(xiàn)和PC機上主數(shù)據(jù)源之間的數(shù)據(jù)交換,,實現(xiàn)系統(tǒng)服務(wù)器端數(shù)據(jù)的管理,,接收嵌入式終端上傳的數(shù)據(jù)和下載數(shù)據(jù)到嵌入式終端機等操作。
2 SQLite的體系結(jié)構(gòu)及開發(fā)技術(shù)
SQLite是D·理查德·希普開發(fā)的用一個小型C庫實現(xiàn)的一種強有力的嵌入式關(guān)系數(shù)據(jù)庫管理體制,。它提供對SQL92的大多數(shù)支持:多表,、索引、事務(wù),、視圖,、觸發(fā)和一系列的用戶接口及驅(qū)動,。
2.1 SQLite的體系結(jié)構(gòu)
SQLite可以分成8個主要子系統(tǒng),,如圖1所示。頂層是標記處理器(tokenizer)和分析器(parser),。高度優(yōu)化的分析生成器可以快速生成高效率的代碼,。底部是基于Knuth經(jīng)過優(yōu)化的B樹。這樣可以運行在可調(diào)整的頁面緩沖(pagecache)上,,有助于將對磁盤的查找減到最少,。再往下是頁面高速緩存。它作用在OS的抽象層之上,,這樣的安排有助于數(shù)據(jù)庫的移動,。體系結(jié)構(gòu)的核心是虛擬數(shù)據(jù)庫引擎(VDBE)。VDBE完成與數(shù)據(jù)操作相關(guān)的全部操作并且是客戶和儲存之間進行信息交換的中間單元,。它是SQLite的核心,。在SQL語句被分析之后,VDBE開始起作用,。代碼生成器將分析樹翻譯成一個袖珍程序,,隨后這些袖珍程序被組合成用VDBE虛擬機器語言表示的一系列指令。如此往復(fù),,VDBE執(zhí)行每條指令,,最終完成SQL語句指定的查詢要求。VDBE的機器語言由圍繞數(shù)據(jù)庫管理的128個操作碼(op—code)組成,。對于打開表,、查詢索引、存儲和刪除記錄以及很多其他數(shù)據(jù)庫操作都有對應(yīng)的操作碼。VDBE里的每條指令由1個操作碼和3個操作數(shù)(operand)組成,。一些指令使用全部3個操作數(shù),,也有些指令一個也未使用。這完全取決于指令的性質(zhì),。例如Open指令用于打開一個表的指針,,使用了全部3個操作數(shù):第1個操作數(shù)(P1)包含指針的ID號,第2個操作數(shù)(P2)指出表的根位置(或者表的首頁位置),,第3個操作數(shù)是表的名字,。
2.2 SQLite開發(fā)技術(shù)
SQLite的API易于使用,只需要3個用來執(zhí)行SQL和獲得數(shù)據(jù)的函數(shù),。它還是可擴展的,,允許程序員自定義函數(shù),然后通過callback()函數(shù)集合進去,。開放源碼團體已經(jīng)擴展了眾多的客戶接口,、適配器、驅(qū)動等,,這就使得其他語言使用SQLite也成為可能,。
使用C語言API只需要三步。首先,,提供文件名和訪問模式,,來調(diào)用sqlite_open()連接數(shù)據(jù)庫。然后,,執(zhí)行callback()函數(shù),,SQLite通過對每個記錄執(zhí)行callback()函數(shù)獲得從數(shù)據(jù)庫那里得到的結(jié)果。最后,,如果想執(zhí)行一個SQL查詢并獲得一個callback()函數(shù)的指針,,可以調(diào)用sqlite_exec()。另外還可以調(diào)用sqlite3_get_table()函數(shù)獲得數(shù)據(jù)表單的內(nèi)容,。
SQLite還提供了存取二進制大對象(BLOB)的方法,,同時在線程安全、數(shù)據(jù)庫管理,、API的擴展等方面也都提供了強大方便的技術(shù)支持,。
3 SQLite在ARM9開發(fā)板上的編譯及拷貝
在SQLite官方網(wǎng)www.sqlite.org下載SQLite-3.3.8版本,在終端解壓生成SQLite-3.3.8目錄,。進入此目錄,,對sqlite/src/sqliteInt.h作一定的修改,以確保btree(B樹)有正確的變量大小,。不同體系結(jié)構(gòu)的Linux會有些差別,。對于ARM-Linux可找到如下部分:
這樣后面的“typedef INTPTR_TYPE ptr;”就定義為“int”類型,,而不是“long long”。
修改configure文件的內(nèi)容,,注釋掉相關(guān)代碼,,讓系統(tǒng)不去檢查交叉編譯環(huán)境,否則會出現(xiàn)錯誤,,不能生成Makefile文件,。然后新建一個文件夾sqlite-arm-linux來保存將要生成的庫文件,運行以下命令進行配置:
將在本目錄下生成Makefile文件,。修改Makefile文件中如下語句,,指定主機編譯器為GCC:
這時就可以運行make & & make install命令開始編譯,若無其他錯誤提示,,則會在/../sqlite-3.3.8/sqlite-arm-linux/lib目錄下生成庫文件,。主要有l(wèi)ibsqlite3.so、libsqlite3.so.O,、libsqlite3.so.O.8.6三個文件,。同時在bin文件夾下生成了可執(zhí)行文件sqlite3。為了減小執(zhí)行文件大小,,用strip命令處理去掉其中的調(diào)試信息,。
庫文件生成后,可以通過NFS(網(wǎng)絡(luò)文件系統(tǒng))把相關(guān)庫文件拷貝到ARM開發(fā)板上,,設(shè)置好主機NFS服務(wù)器,,啟動目標板后,執(zhí)行:
其中192.168.1.101為NFS服務(wù)器IP,,這樣就把SQLite庫文件所在文件夾掛載到了目標板上,拷貝時注意加上-aRF選項,,因為libsqlite3.so和libsqlite3.so.O是鏈接到Iibsqlite3.so.O.8.6的,。4 嵌入式數(shù)據(jù)庫系統(tǒng)設(shè)計及實現(xiàn)
對嵌入式系統(tǒng)而言,強大的圖形用戶接口使系統(tǒng)的功能更加豐富,。目前有眾多的GUI可供使用,,考慮到授權(quán)和價格的因素,我們在Qt/Embedded基礎(chǔ)上進行數(shù)據(jù)庫界面程序的開發(fā),,完成嵌入式數(shù)據(jù)庫系統(tǒng)的設(shè)計,。Qt良好的封裝機制使Qt的模塊化程度非常高,可重用性較好,。嵌入式數(shù)據(jù)庫系統(tǒng)的基本結(jié)構(gòu)如圖2所示,。
通過Qt的QTable控件來實現(xiàn)數(shù)據(jù)表單的顯示,通過QListView,、QC20mBobox以及QTextEdit等控件進行數(shù)據(jù)表單的選擇,、數(shù)據(jù)輸入等,配合PushButton控件實現(xiàn)數(shù)據(jù)表的創(chuàng)建、刪除和數(shù)據(jù)查詢,、添加,、刪除、修改等操作,。這樣,,實現(xiàn)數(shù)據(jù)庫系統(tǒng)的基本管理,并可利用串口實現(xiàn)與后臺數(shù)據(jù)庫之間的數(shù)據(jù)交互,。本系統(tǒng)利用Qt Designer實現(xiàn)數(shù)據(jù)庫界面的快速開發(fā),,并通過調(diào)用SQLite的API接口函數(shù)實現(xiàn)數(shù)據(jù)庫的基本操作。下面簡要介紹一下用QtDesigner開發(fā)數(shù)據(jù)庫界面的基本方法及關(guān)鍵代碼,。新建一個C++項目,,在此基礎(chǔ)上新建一個窗口部件,在窗口部件上添加一個Table控件作為數(shù)據(jù)表單的顯示界面,。另根據(jù)需要,,添加PushButton控件以實現(xiàn)相應(yīng)的操作。在窗口類下新建一個槽,,命名為SelectSlot(),。連接相關(guān)按鈕信號,關(guān)鍵代碼如下:
其中tableView函數(shù)的作用是將查詢得到的數(shù)據(jù)表顯示在Table控件中,。函數(shù)體程序如下:
終端下進入工程目錄,,修改*.pro文件,并添加如下內(nèi)容:
這里加入了編譯程序所需庫文件的路徑以及sqlite.h頭文件的路徑,。這一切做好后,,開始編譯。
tmake-o Makefile EDBMS.pro生成Makefile,,將其中的編譯工具改為arm-linux-g++,,加上交叉編譯的相關(guān)庫文件。然后make編譯,,生成能在ARM開發(fā)板上運行的二進制文件,,并且通過NFS掛載到開發(fā)板上。運行./EDBMS,,會出現(xiàn)我們設(shè)計的窗口界面,。查詢一個數(shù)據(jù)表的內(nèi)容并顯示在QTable控件上,主界面效果如圖3所示,。
另外,,系統(tǒng)運用SQL Servqr。2000作為后臺數(shù)據(jù)庫,,用VB 6.O開發(fā),,通過ODBC與數(shù)據(jù)庫連接,,實現(xiàn)后臺數(shù)據(jù)庫管理,并負責(zé)接收和處理客戶端請求,。PC機與嵌入設(shè)備端則可以通過串口進行通信,,以完善系統(tǒng)功能。這樣,,一個較為完備的嵌入式數(shù)據(jù)庫系統(tǒng)就構(gòu)建起來了,。
結(jié) 語
本文結(jié)合嵌入式數(shù)據(jù)庫的特點,運用SQLite在ARM-Linux平臺上構(gòu)建嵌入式數(shù)據(jù)庫系統(tǒng),。在此基礎(chǔ)上利用Qt設(shè)計了數(shù)據(jù)庫界面,,使用SQLite的API實現(xiàn)數(shù)據(jù)庫的基本操作。最后對后臺數(shù)據(jù)庫的配置及串口通信機制做了簡要介紹,,完成了整個嵌入式數(shù)據(jù)庫系統(tǒng)的構(gòu)建,。