摘 要:文章提出了基于嵌入式的簡(jiǎn)單數(shù)據(jù)庫(kù)設(shè)計(jì)。設(shè)計(jì)了以S3C2440A微處理器作為數(shù)據(jù)庫(kù)數(shù)據(jù)采集的硬件控制核心,然后指出了嵌入式下數(shù)據(jù)庫(kù)的需求特點(diǎn),對(duì)在ARM-Linux下的SQLite數(shù)據(jù)庫(kù)的體系進(jìn)行分析,再結(jié)合ARM-Linux開(kāi)發(fā)板給出了如何實(shí)現(xiàn)SQLite數(shù)據(jù)庫(kù)的具體方法。
關(guān)鍵詞:嵌入式;SQLite數(shù)據(jù)庫(kù);ARM-Linux開(kāi)發(fā)平臺(tái)
引言
現(xiàn)有的RTU多基于ARM7開(kāi)發(fā)板上的程序植入和數(shù)據(jù)庫(kù)管理,對(duì)于多線程的數(shù)據(jù)管理,以及種類(lèi)繁多的第三方數(shù)據(jù)接口,顯得力不從心。本課題擬在ARM9處理器上進(jìn)行數(shù)據(jù)庫(kù)的建立,對(duì)底層的數(shù)據(jù)采集,并對(duì)采集數(shù)據(jù)進(jìn)行歷史保留和遠(yuǎn)程管理。其中,數(shù)據(jù)庫(kù)的建立運(yùn)用可基于嵌入式系統(tǒng)的小型數(shù)據(jù)庫(kù)SQlite,SQLite是一款嵌入式數(shù)據(jù)庫(kù),沒(méi)有獨(dú)立運(yùn)行的進(jìn)程,在所服務(wù)的應(yīng)用程序在應(yīng)用程序進(jìn)程空間中是共同存在的。它與應(yīng)用程序的代碼也是一起的,作為它所服務(wù)程序的一部分,同時(shí)提供了豐富的數(shù)據(jù)庫(kù)接口;而對(duì)數(shù)據(jù)采集,則由底層設(shè)備驅(qū)動(dòng)程序完成。
1 數(shù)據(jù)庫(kù)數(shù)據(jù)采集的硬件平臺(tái)設(shè)計(jì)
為了實(shí)時(shí)的對(duì)現(xiàn)場(chǎng)數(shù)據(jù)的采集和傳輸,我們采用功能強(qiáng)大的ARM9作為主控處理器,外接相關(guān)功能模塊,在ARM9處理器上嵌入Linux操作系統(tǒng),其強(qiáng)大的多任務(wù)和多線程以及設(shè)備獨(dú)立性能夠較好的發(fā)揮ARM9強(qiáng)大的控制功能。
現(xiàn)場(chǎng)數(shù)據(jù)采集主要由:數(shù)字量輸入、輸出模塊、模擬量輸入模塊組成。數(shù)字量輸入模塊將外部采集的數(shù)據(jù)經(jīng)過(guò)處理輸入到ARM9處理器;模擬量輸入模塊采集外部輸入的模擬量;數(shù)字量輸出模塊采集主控處理器的輸出量。如圖1所示。
圖1 硬件系統(tǒng)主要構(gòu)成圖
數(shù)據(jù)的存儲(chǔ)和傳輸部分主要包括S3C2440A微處理器、存儲(chǔ)器模塊、數(shù)據(jù)通信模塊、RS458模塊、以太網(wǎng)模塊、無(wú)線功能模塊等。該處理器是基于ARM920T核心的16/32位的精簡(jiǎn)指令集(RISC)微處理器,S3C2440A為手持設(shè)備和一些小型應(yīng)用提供了低耗能、低價(jià)格、高性能提供了一個(gè)絕佳的選擇。它采用了新的總線結(jié)構(gòu)AMBA(Advanced Microcontroller Bus Architecture),這一結(jié)構(gòu)具有獨(dú)立的16KB指令緩存和16KB數(shù)據(jù)緩存,每個(gè)都是由8字長(zhǎng)的行組成。因?yàn)樗哂幸惶淄暾南到y(tǒng)外設(shè),S3C2440A降低了整體的系統(tǒng)成本并且不需配置另外的組件。這部分的主要功能是對(duì)現(xiàn)場(chǎng)采集數(shù)據(jù)進(jìn)行處理、存儲(chǔ)和顯示,之后通過(guò)網(wǎng)絡(luò)把所采集的數(shù)據(jù)上傳到遠(yuǎn)程的PC機(jī)網(wǎng)頁(yè)上。遠(yuǎn)程的PC機(jī)主要負(fù)責(zé)的功能是對(duì)所上傳的數(shù)據(jù)進(jìn)行監(jiān)測(cè)、分析、處理。必要時(shí)對(duì)采集終端進(jìn)行控制。
2 Linux下的數(shù)據(jù)庫(kù)的應(yīng)用
基于Linux系統(tǒng)下的數(shù)據(jù)庫(kù)數(shù)不勝數(shù),大型應(yīng)用于商業(yè)開(kāi)發(fā)的數(shù)據(jù)庫(kù)有Sybase、Empress、Oracle、Informix等,小型數(shù)據(jù)庫(kù)常用的有mSQL、MySQL、Sqlite等等。應(yīng)用于商業(yè)開(kāi)發(fā)的大型數(shù)據(jù)庫(kù)一般價(jià)格高昂并且體積龐大,不符合嵌入式下數(shù)據(jù)庫(kù)要求。在小型數(shù)據(jù)庫(kù)中MySQL雖說(shuō)在保持體積較小的情況,提供了足夠的應(yīng)用與一般開(kāi)發(fā)的功能,但是在應(yīng)用于商業(yè)用途也要收費(fèi)。mSQI具有嵌入式開(kāi)發(fā)的條件,但是由于它并非完全開(kāi)源的代碼,在使用期限上不符合本設(shè)計(jì)的要求。余下的開(kāi)放源碼數(shù)據(jù)庫(kù)中,除了占用空間較大以外,學(xué)習(xí)難度也比較大,如果非要采用的話必然會(huì)加大開(kāi)發(fā)成本。
SQLite支持大部分的SQL的語(yǔ)句,采用單文件存放數(shù)據(jù)庫(kù),存儲(chǔ)速度也快,在操作語(yǔ)句上與關(guān)系數(shù)據(jù)庫(kù)類(lèi)型更加接近,最重要的是它的代碼使完全開(kāi)源的,不用收費(fèi)?;赟QLite的設(shè)計(jì)理念,雖然相較與商業(yè)用途的大型數(shù)據(jù)庫(kù)在功能上有所不足,但是在開(kāi)源組織的日漸完善下差距逐漸縮小。在應(yīng)用上如果不需要存儲(chǔ)過(guò)程或者復(fù)雜的表之間的關(guān)聯(lián)的話,SQLite是個(gè)非常好的平衡點(diǎn)。
3 SQLite的體系結(jié)構(gòu)以及在Linux平臺(tái)上的開(kāi)發(fā)技術(shù)
3.1 SQLite的體系結(jié)構(gòu)
SQLite有一套簡(jiǎn)潔的、模塊化的體系結(jié)構(gòu),并引進(jìn)了一些方法進(jìn)行有關(guān)關(guān)系型數(shù)據(jù)庫(kù)的管理。SQLite的體系結(jié)構(gòu)由3個(gè)子系統(tǒng)和8個(gè)獨(dú)立模塊組成,如圖2所示,它顯示了SQLite的主要成分及各成分之間的關(guān)聯(lián),其中有一些相當(dāng)接近于關(guān)系數(shù)據(jù)庫(kù)管理。
圖2 SQLite的體系機(jī)構(gòu)
接口位于整個(gè)結(jié)構(gòu)的頂端,由SQLite C API組成。所有與SQLite交互的程序和庫(kù)文件都是通過(guò)接口進(jìn)行的。Tokenizer(詞法分析器)和Parser(語(yǔ)法分析器)協(xié)同對(duì)文本形式的查詢語(yǔ)言進(jìn)行分析,驗(yàn)證其語(yǔ)法的有效性,然后轉(zhuǎn)化成底層能更容易處理的層次化數(shù)據(jù)結(jié)構(gòu)。這個(gè)結(jié)構(gòu)的中心部分便是數(shù)據(jù)庫(kù)引擎VDBE(Virtual DataBase Engine)。VDBE在字節(jié)碼上工作,區(qū)別于頂層操作系統(tǒng)、系統(tǒng)體系結(jié)構(gòu)和CPU。B-tree、page cache(頁(yè)緩存)、操作系統(tǒng)接口組成了整個(gè)后端。B-tree和pager作為信息代理,他們并不知道信息內(nèi)容,只是對(duì)這些信息進(jìn)行移動(dòng)和排列。
3.2 SQLite在ARM上的實(shí)現(xiàn)
SQLite嵌入式數(shù)據(jù)庫(kù)的代碼使開(kāi)源的,根據(jù)不同需求的硬件平臺(tái),對(duì)源碼進(jìn)行交叉編譯即可實(shí)現(xiàn)移植。在上的編譯過(guò)程主要有以下幾個(gè)步驟:
解壓sqlite壓縮文件
tar -zvxf sqlite-autoconf-3071300.tar.g
得到文件sqlite-autoconf-307130
進(jìn)入sqlite-autoconf-3071300目錄
[root@localhost ~]# cd /home/sqlite-autoconf-3071300/
配置
[root@localhost sqlite-autoconf-3071300]# ./configure
編譯
[root@localhost sqlite-autoconf-3071300]# make
安裝
[root@localhost sqlite-autoconf-3071300]# make install
默認(rèn)安裝路徑為/usr/local/及系統(tǒng)標(biāo)準(zhǔn)目錄
頭文件 sqlite3.h sqlite3ext.h安裝在 /usr/local/include下
以及頭文件標(biāo)準(zhǔn)目錄 /usr/include下
庫(kù)文件
libsqlite3.a libsqlite3.so.0.8.6 libsqlite3.so.0 libsqlite3.so
安裝在/usr/local/lib目錄下并且共享庫(kù)文件libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6安裝在系統(tǒng)庫(kù)文件標(biāo)準(zhǔn)目錄/usr/lib下,可執(zhí)行文件sqlite3安裝在/usr/local/bin目錄下以及系統(tǒng)可執(zhí)行標(biāo)準(zhǔn)目錄/usr/bin下,幫助文檔man安裝在/usr/local/share目錄下。
修改Makefile文件:
將代碼行BBC=arm-linux-gcc-g-02改成BBC=gcc-g-02。用make生成sqlite、libsqlite.a和libsqlite.so。為了減小執(zhí)行文件大小可用strip處理,去掉其中的調(diào)試信息。
在ARM板上運(yùn)行SQLite:
將SQLite下載到ARM板的/tmp目錄,修改權(quán)限并運(yùn)行:
chmod +wx sqlite
./sqliteest.sqlite
會(huì)出現(xiàn):
sqlite>
如果一切正常,SQLite已經(jīng)在ARM-Linux下正常運(yùn)行,然后就可以基于此進(jìn)行數(shù)據(jù)庫(kù)數(shù)據(jù)的遠(yuǎn)程處理。
4 結(jié)束語(yǔ)
該遠(yuǎn)程數(shù)據(jù)庫(kù)的設(shè)計(jì),可以提高現(xiàn)階段RTU在ARM7開(kāi)發(fā)板上的歷史數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)借調(diào)的缺點(diǎn),在分析對(duì)比了各數(shù)據(jù)庫(kù)在嵌入式下的表現(xiàn),選取了比較符合需求的SQLite數(shù)據(jù)庫(kù),并且完成了在ARM-Linux下的編譯以及開(kāi)發(fā)工作。實(shí)踐證明,基于ARM9的數(shù)據(jù)庫(kù)設(shè)計(jì)可以完成對(duì)數(shù)據(jù)采集更多的需求。
參考文獻(xiàn)
[1]李文進(jìn),韓曉萍.ARM平臺(tái)在嵌入式遠(yuǎn)程數(shù)據(jù)采集系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)[J].繼電器,2006,05:64-67.
[2]郝曉弘,李桂肅,瞿華.基于移動(dòng)網(wǎng)絡(luò)的嵌入式遠(yuǎn)程數(shù)據(jù)終端實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2007,05:24-25+23.
[3]黃萬(wàn)志,陳永煌.基于嵌入式Linux的遠(yuǎn)程數(shù)據(jù)采集系統(tǒng)[J].現(xiàn)代電子技術(shù),2007,04:55-57.
[4]周衛(wèi)玉,孫新亞.基于ARM和uCLinux的嵌入式遠(yuǎn)程數(shù)據(jù)采集終端[J].計(jì)算機(jī)工程,2004,23:156-158.
作者簡(jiǎn)介:李少雄(1990,3-),男,陜西省咸陽(yáng)市,西安石油大學(xué),2012級(jí),碩士研究生,計(jì)算機(jī)院,計(jì)算機(jī)科學(xué)與技術(shù),計(jì)算機(jī)技術(shù)。