李鼎 張秀芳 劉洲洲
摘 要:針對嵌入式系統(tǒng)數(shù)據(jù)庫初始化過程復(fù)雜而影響整體系統(tǒng)進程的問題,將Nucleus數(shù)據(jù)庫系統(tǒng)的索引表占用地址空間縮減,同時交換塊不占地址空間,將其臨時存放在數(shù)據(jù)庫索引表的末尾節(jié)點,同時記錄區(qū)占用剩余地址空間,重點處理索引表中的數(shù)據(jù)庫記錄ID,對其進行編碼,使得可以區(qū)分數(shù)據(jù)庫類型以及記錄的類別且與文件系統(tǒng)以及注冊表無關(guān)。系統(tǒng)測試結(jié)果表明該方法提高了數(shù)據(jù)庫的存取速度且便于移植。
關(guān)鍵詞:Nucleus; 嵌入式系統(tǒng); 數(shù)據(jù)庫; 架構(gòu)
中圖分類號: TP311.5
文獻標志碼: A
Abstract:In order to solve the problem that the initialization process of embedded system database is complex and then affects the whole system process, this paper reduces the address space occupied by the index table in the nucleus database system, at the same time, the exchange block does not occupy the address space, temporarily stores it at the end node of the database index table, at the same time, the record area occupies the remaining address space, and focuses on dealing with the database record ID in the index table, which makes it possible to distinguish between database types and record types and is independent of file system and registry. The test results show that this method improves the access speed of database and is easy to be transplanted.
Key words:Nucleus; Embedded system; Database; Architecture
0 引言
嵌入式系統(tǒng)諸如智能手機,智能手環(huán),PAD等作為物聯(lián)網(wǎng)設(shè)備已經(jīng)廣泛地應(yīng)用在多種領(lǐng)域[1-4]。其中系統(tǒng)用戶可以根據(jù)自身的軟硬件環(huán)境的要求,選擇合適的操作系統(tǒng)。其中數(shù)據(jù)庫作為系統(tǒng)的關(guān)鍵模塊,有至關(guān)重要的作用,由于記錄索引表、交換區(qū)和數(shù)據(jù)記錄區(qū)構(gòu)成整個數(shù)據(jù)庫系統(tǒng),其中記錄索引表占用一個地址空間且固定,而交換區(qū)不占地址空間,數(shù)據(jù)記錄區(qū)占用其余的地址空間。在記錄索引表中有每條數(shù)據(jù)庫的地址、ID、類別、大小等信息。且每個記錄ID唯一, ID號可以區(qū)分數(shù)據(jù)庫以及記錄的類別,本文提出一種ID號的編碼規(guī)則,索引表以一個記錄的形式保存到數(shù)據(jù)庫里,并用記錄類別加以區(qū)分,同時基于數(shù)據(jù)庫設(shè)備,與文件系統(tǒng)以及注冊表無關(guān),可以有效提高嵌入式系統(tǒng)數(shù)據(jù)庫存取速度且魯棒性增強。
1 Nucleus嵌入式系統(tǒng)
Nucleus[5-7]是為實時嵌入式應(yīng)用而設(shè)計的一個搶先式多任務(wù)操作系統(tǒng)。Nucleus系統(tǒng)的各層通訊協(xié)議都提供了由ANSIC寫成的源碼,有利于系統(tǒng)的可移植性并支持大部分處理器。而且Nucleus系統(tǒng)針對不同的處理器的源碼大部分也是相同的且少部分跟CPU相關(guān)由匯編完成[2]。該操作系統(tǒng)完全開源,可以通過修改開源代碼進行所需的配置,調(diào)試可以在中斷和寄存器級進行。核心函數(shù)API和程序代碼鏈接一起生產(chǎn)目標代碼,可以直接燒制到目標板卡中,整個核心代碼區(qū)內(nèi)核規(guī)模非常小,方便調(diào)試。其中該系統(tǒng)[8-11]典型特點是對于堆棧的管理時將中斷時線程堆棧和系統(tǒng)堆棧分開,可以使得當系統(tǒng)空閑時使用系統(tǒng)堆棧,中斷嵌套處理比較簡單,而且Nucleus內(nèi)核比較簡練,任務(wù)搶占的延遲可能會比較短,且內(nèi)核和網(wǎng)絡(luò)協(xié)議都是開源碼的形式,不足之處在于對實時性不夠、定時中斷管理不可靠和對系統(tǒng)中斷的處理容易產(chǎn)生堆棧格式錯誤。
2 系統(tǒng)架構(gòu)
本文在整個數(shù)據(jù)庫系統(tǒng)定義一個管理數(shù)據(jù)庫命名為:sysdb,該數(shù)據(jù)庫中的每一條記錄標識著設(shè)備用戶自己建立的數(shù)據(jù)庫,其中內(nèi)容包含了數(shù)據(jù)庫名稱、索引表數(shù)目、比較函數(shù)等關(guān)鍵信息,且數(shù)據(jù)庫名不可重復(fù),大小寫信息不敏感。當設(shè)備用戶創(chuàng)建、打開數(shù)據(jù)庫時候就要訪問到管理數(shù)據(jù)庫sysdb。
2.1 記錄索引表
本文設(shè)置索引表在開始地址空間,由32字節(jié)的頭部:HEAD和一個索引表構(gòu)成,HEAD可用來填寫嵌入式系統(tǒng)的版本信息等。索引表的每項占12字節(jié),共有5 458項,最后剩余4個字節(jié)保留。整個結(jié)構(gòu)如下:
片IDHEAD索引表 冗余保留
4Bytes32Bytes12Bytes12Bytes……4Bytes
本文索引表用C語言描述為:
typedef struct tagIndex{
LONG id; //記錄ID
WORD dir; //記錄的目錄號
WORD size; //記錄大小
LONG addr; //記錄的邏輯地址
}RECINDEX, *pRECINDEX;
其中目錄號(WORD dir)表明該記錄所在的目錄,記錄大小(WORD size)表明記錄的實際大小,存儲時自動向4字節(jié)對齊,規(guī)定記錄大小不大于64 K。記錄的邏輯地址(LONG addr)由低28 bit的偏移值和高4 bit標志位構(gòu)成。 其中,偏移值是記錄的邏輯地址,取之范圍0~2 M。Flag是掉電保護標志,和Bank ID的含義類似,具體含義如下:
Flag = 0xF 表示該節(jié)點空閑(Free)。
Flag = 0xE 表示正在剛剛寫完該記錄,此時記錄是完整的。
Flag = 0xC 表示該節(jié)點的記錄在使用中,記錄有效。
Flag = 0x8 表示該節(jié)點的記錄是已經(jīng)被刪除了,但是排序表正在更新。
Flag = 0x0 表示該節(jié)點的記錄是已經(jīng)被刪除了,排序表更新完畢。
Flag =其他 無效標志。
整個書庫系統(tǒng)的所有記錄個數(shù)的總和不能大于5 458,事實上,書庫系統(tǒng)在記錄總和接近5 400時,就開始限制加入記錄了,留下的58個節(jié)點用作臟塊整理的空間。
3.2 管理數(shù)據(jù)庫sysdb
當數(shù)據(jù)庫系統(tǒng)初始化時打開管理數(shù)據(jù)庫sysdb。sysdb沒有索引記錄,記錄類別只有一種,而且每條記錄注冊著一個用戶創(chuàng)建的數(shù)據(jù)庫。本文將sysdb的記錄格式定義如下:
typedef struct tagdatabase{
char dbName[DB_MAX_NAME_LEN]; //數(shù)據(jù)庫名稱
DWORD pDataSortProc[DB_MAX_DATA_SORT _COUNT]; //數(shù)據(jù)記錄排序函數(shù)表
DWORD pDirSortProc[DB_MAX_DIR_SORT _COUNT]; //目錄記錄排序函數(shù)表
}DBINFO;
其中:dbName是一個定長的字符串記錄著數(shù)據(jù)庫名稱,大小寫不敏感,強調(diào)一點就是數(shù)據(jù)庫名稱不能重復(fù)。因為用戶打開數(shù)據(jù)庫時要靠該名稱唯一標識數(shù)據(jù)庫。pDataSortProc 和pDirSortProc是兩個函數(shù)指針表,分別表示按照數(shù)據(jù)記錄排序和按照目錄記錄排序,他的大小表明最多有可以建立那么多排序表,每個函數(shù)指針標示一個排序方法,所有函數(shù)指針初始化成為0xFFFFFFFF,一個數(shù)據(jù)庫的排序表的個數(shù)可以在創(chuàng)建數(shù)據(jù)庫時候指定,同時要指定一個函數(shù)指針,一旦指定了該函數(shù)指針,就永遠不得修改,但是可以事后增加、刪除排序方法,只要不超過限定的數(shù)目。排序表的下標用來作為記錄ID編碼的元素,sysdb的記錄ID會作為該記錄的數(shù)據(jù)庫的ID,數(shù)據(jù)庫ID同樣是記錄ID編碼的元素,sysdb的數(shù)據(jù)庫ID內(nèi)定為0。規(guī)定sysdb的記錄個數(shù)不能大于0x100。
3.3 ID編碼規(guī)則
本文將記錄ID由4個字節(jié)構(gòu)成,從中可以解析出三種信息,分別是數(shù)據(jù)庫ID、記錄類別、記錄流水號。結(jié)構(gòu)如下:
0~7 bit,庫ID8~15 bit,類別16~31 bit,記錄流水號
其中:數(shù)據(jù)庫ID是系統(tǒng)管理數(shù)據(jù)庫sysdb的記錄ID的記錄流水號的低8位,高8位必然為0。數(shù)據(jù)庫的記錄有四種類別:數(shù)據(jù)記錄(0x00)、目錄(0x01)、數(shù)據(jù)排序記錄(0x02)、目錄排序記錄(0x04),同時根據(jù)四種記錄類別,記錄流水號分別稱作數(shù)據(jù)記錄流水號、目錄流水號、數(shù)據(jù)排序索引、目錄排序索引。同一個數(shù)據(jù)庫的數(shù)據(jù)記錄流水號不能重復(fù);同一個數(shù)據(jù)庫的目錄記錄流水號不能重復(fù);同一個數(shù)據(jù)庫的數(shù)據(jù)排序記錄索引不能重復(fù);同一個數(shù)據(jù)庫的目錄排序記錄索引不能重復(fù)。目錄流水號和數(shù)據(jù)流水號是加入數(shù)據(jù)庫的同類別記錄的流水號遞增的數(shù)值。排序索引是排序方法的ID號。流水號原則上是向上累加,并且從1開始,0表示無效,這與排序記錄的修改有關(guān),當加到0xFFFF時,再去查找并使用以前刪除掉的記錄的流水號,就是說已經(jīng)刪除掉的記錄流水號可以再次利用,但是一個記錄一旦創(chuàng)建,其記錄ID號終生不變,并且要按照記錄ID號中的流水號來建立排序表。
3 系統(tǒng)功能實現(xiàn)
由于每個數(shù)據(jù)庫[12-15]記錄有一個目錄屬性,表明該記錄屬于哪個目錄,目錄實際上是記錄的歸類信息。目錄本身也當作記錄存儲在數(shù)據(jù)庫中,目錄作為記錄他也有一個所屬目錄的屬性,表明自己的父目錄,由此可見整個是一個樹狀結(jié)構(gòu),數(shù)據(jù)記錄是葉子節(jié)點,樹根是sysdb。一個數(shù)據(jù)庫的根目錄沒有記錄和他對應(yīng),定義根目錄的記錄ID等于0。本文數(shù)據(jù)庫流程圖如圖1所示。
4 系統(tǒng)測試
本文通過上位機和下位機測試兩種方式:同時按下電源開關(guān)鍵(掛斷鍵)和退出鍵(右功能鍵)用傳輸線將小機同PC連接起來:在PC端啟動“數(shù)據(jù)庫測試程序”,小機端:按開關(guān)鍵開機連接成功后,在PC端選擇“系統(tǒng)自檢”。首先進行串口測試如圖2所示,同時分別測試串口0和串口1,并顯示測試結(jié)果。在測試夾具上,將會將串口0和串口1短接,故各串口自發(fā)自收,自動判斷測試結(jié)果如圖2所示。
對于所有記錄,系統(tǒng)將自動加入一個時間戳,來表示記錄建立或修改的時間。增加、修改、刪除一條數(shù)據(jù)記錄,系統(tǒng)將自動修有的數(shù)據(jù)排序記錄。同樣,增加、修改、刪除一條目錄記錄,系統(tǒng)將自動修改所有的目錄排序記錄。排序記錄的時間戳是做后修改的時間,數(shù)據(jù)或目錄記錄得時間戳是記錄建立的時間,在系統(tǒng)自檢過程前完成所有數(shù)據(jù)庫的創(chuàng)建和記錄,如圖3所示。
通過系統(tǒng)軟件測試,表明通過設(shè)置系統(tǒng)索引表和系統(tǒng)ID編碼使得數(shù)據(jù)庫系統(tǒng)同時存取速度提高,且系統(tǒng)可靠性也得到了增強。
5 總結(jié)
Nucleus作為開放嵌入式系統(tǒng),具有實時性和多任務(wù)性,系統(tǒng)資源的調(diào)度都在其有效管理控制下可以使嵌入式多任務(wù)的開發(fā)變得省時和省力,同時高效率,本文分析了基于Nucleus的嵌入式數(shù)據(jù)庫系統(tǒng)索引表的機理和重新定義了ID編碼,,對于嵌入式實時操作系統(tǒng)的開發(fā)具有重要的意義,下一步將對在系統(tǒng)掉電情況下的數(shù)據(jù)庫保護進行研究。
參考文獻
[1] Zhang R R, Xu Z Y, Ma Z G, et al. Global α - nucleus optical model based on a Dirac Brueckner Hartree Fock approach[J]. Nuclear Physics, Section A,2019,57(1):990-997.
[2] Nicholas Everett, Sarah Baracz, Jennifer Cornish. Oxytocin treatment in the prelimbic cortex reduces relapse to methamphetamine-seeking and is associated with reduced activity in the rostral nucleus accumbens core[J]. Pharmacology, Biochemistry and Behavior,2019,15(1):183-187.
[3] 汪洋,禹珉. 基于Nucleus操作系統(tǒng)實現(xiàn)TCP和UDP協(xié)議通信[J].軟件工程,2018,21(9):29-33.
[4] 段亞林,謝永斌.基于Nucleus的通信終端中AT指令模塊的設(shè)計與實現(xiàn)[J].計算機測量與控制,2015,23(11):3744-3746.
[5] 陳連坤.嵌入式系統(tǒng)的設(shè)計與開發(fā)[M].北京:清華大學出版社,2005.
[6] 臺灣廣達微電子設(shè)計有限公司.基帶處理器手冊[M].臺灣:臺灣廣達微電子設(shè)計有限公司,2007.
[7] Douglas Boling. Microsoft Windows CE 程序設(shè)計[M]. 北京:北京大學出版社,1999.
[8] 蔡志明,盧傳富,李立夏.精通Qt4編程[M].北京:電子工業(yè)出版社,2008.
[9] 汪兵,李存斌. EVC高級編程及其應(yīng)用開發(fā)(Embedded Visual C++嵌入式編程)[M].北京:中國水利水電出版社,2005.
[10] 繼剛. 面向智能手機的嵌入式實時操作系統(tǒng)[J].中興通訊技術(shù),2005,16(4):97-99.
[11] 彭濤.嵌入式操作系統(tǒng)移植技術(shù)研究[D].武漢:華中科技大學,2006.
[12] Zhao Zheng, Wang Lei, Liu Huan, et al. On similarity preserving feature selection[J]. IEEE Trans on Knowledge and Data Engineering, 2013, 25(3): 619-632.
[13] Marwedel P. Embedded system design[M].北京:科學出版社,2007.
[14] Gloria D Alessandro. Mircoprocessor design for embedded system [J].Journal of Systems Architecture, 2009, 45(6):1139-1149.
[15] 魏振華.嵌入式實時操作系統(tǒng)Nucleus中線程控制部件的實現(xiàn)[J]. 計算機應(yīng)用與研究,2003 ,16(4):97-99.
(收稿日期: 2019.10.31)