李鼎 張秀芳 劉洲洲



摘 要:針對嵌入式系統數據庫初始化過程復雜而影響整體系統進程的問題,將Nucleus數據庫系統的索引表占用地址空間縮減,同時交換塊不占地址空間,將其臨時存放在數據庫索引表的末尾節點,同時記錄區占用剩余地址空間,重點處理索引表中的數據庫記錄ID,對其進行編碼,使得可以區分數據庫類型以及記錄的類別且與文件系統以及注冊表無關。系統測試結果表明該方法提高了數據庫的存取速度且便于移植。
關鍵詞:Nucleus; 嵌入式系統; 數據庫; 架構
中圖分類號: 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 引言
嵌入式系統諸如智能手機,智能手環,PAD等作為物聯網設備已經廣泛地應用在多種領域[1-4]。其中系統用戶可以根據自身的軟硬件環境的要求,選擇合適的操作系統。其中數據庫作為系統的關鍵模塊,有至關重要的作用,由于記錄索引表、交換區和數據記錄區構成整個數據庫系統,其中記錄索引表占用一個地址空間且固定,而交換區不占地址空間,數據記錄區占用其余的地址空間。在記錄索引表中有每條數據庫的地址、ID、類別、大小等信息。且每個記錄ID唯一, ID號可以區分數據庫以及記錄的類別,本文提出一種ID號的編碼規則,索引表以一個記錄的形式保存到數據庫里,并用記錄類別加以區分,同時基于數據庫設備,與文件系統以及注冊表無關,可以有效提高嵌入式系統數據庫存取速度且魯棒性增強。
1 Nucleus嵌入式系統
Nucleus[5-7]是為實時嵌入式應用而設計的一個搶先式多任務操作系統。Nucleus系統的各層通訊協議都提供了由ANSIC寫成的源碼,有利于系統的可移植性并支持大部分處理器。而且Nucleus系統針對不同的處理器的源碼大部分也是相同的且少部分跟CPU相關由匯編完成[2]。該操作系統完全開源,可以通過修改開源代碼進行所需的配置,調試可以在中斷和寄存器級進行。核心函數API和程序代碼鏈接一起生產目標代碼,可以直接燒制到目標板卡中,整個核心代碼區內核規模非常小,方便調試。其中該系統[8-11]典型特點是對于堆棧的管理時將中斷時線程堆棧和系統堆棧分開,可以使得當系統空閑時使用系統堆棧,中斷嵌套處理比較簡單,而且Nucleus內核比較簡練,任務搶占的延遲可能會比較短,且內核和網絡協議都是開源碼的形式,不足之處在于對實時性不夠、定時中斷管理不可靠和對系統中斷的處理容易產生堆棧格式錯誤。
2 系統架構
本文在整個數據庫系統定義一個管理數據庫命名為:sysdb,該數據庫中的每一條記錄標識著設備用戶自己建立的數據庫,其中內容包含了數據庫名稱、索引表數目、比較函數等關鍵信息,且數據庫名不可重復,大小寫信息不敏感。當設備用戶創建、打開數據庫時候就要訪問到管理數據庫sysdb。
2.1 記錄索引表
本文設置索引表在開始地址空間,由32字節的頭部:HEAD和一個索引表構成,HEAD可用來填寫嵌入式系統的版本信息等。索引表的每項占12字節,共有5 458項,最后剩余4個字節保留。整個結構如下:
片IDHEAD索引表 冗余保留
4Bytes32Bytes12Bytes12Bytes……4Bytes
本文索引表用C語言描述為:
typedef struct tagIndex{
LONG id; //記錄ID
WORD dir; //記錄的目錄號
WORD size; //記錄大小
LONG addr; //記錄的邏輯地址
}RECINDEX, *pRECINDEX;
其中目錄號(WORD dir)表明該記錄所在的目錄,記錄大小(WORD size)表明記錄的實際大小,存儲時自動向4字節對齊,規定記錄大小不大于64 K。記錄的邏輯地址(LONG addr)由低28 bit的偏移值和高4 bit標志位構成。 其中,偏移值是記錄的邏輯地址,取之范圍0~2 M。Flag是掉電保護標志,和Bank ID的含義類似,具體含義如下:
Flag = 0xF 表示該節點空閑(Free)。
Flag = 0xE 表示正在剛剛寫完該記錄,此時記錄是完整的。
Flag = 0xC 表示該節點的記錄在使用中,記錄有效。
Flag = 0x8 表示該節點的記錄是已經被刪除了,但是排序表正在更新。
Flag = 0x0 表示該節點的記錄是已經被刪除了,排序表更新完畢。
Flag =其他 無效標志。
整個書庫系統的所有記錄個數的總和不能大于5 458,事實上,書庫系統在記錄總和接近5 400時,就開始限制加入記錄了,留下的58個節點用作臟塊整理的空間。
3.2 管理數據庫sysdb
當數據庫系統初始化時打開管理數據庫sysdb。sysdb沒有索引記錄,記錄類別只有一種,而且每條記錄注冊著一個用戶創建的數據庫。本文將sysdb的記錄格式定義如下:
typedef struct tagdatabase{
char dbName[DB_MAX_NAME_LEN]; //數據庫名稱
DWORD pDataSortProc[DB_MAX_DATA_SORT _COUNT]; //數據記錄排序函數表
DWORD pDirSortProc[DB_MAX_DIR_SORT _COUNT]; //目錄記錄排序函數表
}DBINFO;
其中:dbName是一個定長的字符串記錄著數據庫名稱,大小寫不敏感,強調一點就是數據庫名稱不能重復。因為用戶打開數據庫時要靠該名稱唯一標識數據庫。pDataSortProc 和pDirSortProc是兩個函數指針表,分別表示按照數據記錄排序和按照目錄記錄排序,他的大小表明最多有可以建立那么多排序表,每個函數指針標示一個排序方法,所有函數指針初始化成為0xFFFFFFFF,一個數據庫的排序表的個數可以在創建數據庫時候指定,同時要指定一個函數指針,一旦指定了該函數指針,就永遠不得修改,但是可以事后增加、刪除排序方法,只要不超過限定的數目。排序表的下標用來作為記錄ID編碼的元素,sysdb的記錄ID會作為該記錄的數據庫的ID,數據庫ID同樣是記錄ID編碼的元素,sysdb的數據庫ID內定為0。規定sysdb的記錄個數不能大于0x100。
3.3 ID編碼規則
本文將記錄ID由4個字節構成,從中可以解析出三種信息,分別是數據庫ID、記錄類別、記錄流水號。結構如下:
0~7 bit,庫ID8~15 bit,類別16~31 bit,記錄流水號
其中:數據庫ID是系統管理數據庫sysdb的記錄ID的記錄流水號的低8位,高8位必然為0。數據庫的記錄有四種類別:數據記錄(0x00)、目錄(0x01)、數據排序記錄(0x02)、目錄排序記錄(0x04),同時根據四種記錄類別,記錄流水號分別稱作數據記錄流水號、目錄流水號、數據排序索引、目錄排序索引。同一個數據庫的數據記錄流水號不能重復;同一個數據庫的目錄記錄流水號不能重復;同一個數據庫的數據排序記錄索引不能重復;同一個數據庫的目錄排序記錄索引不能重復。目錄流水號和數據流水號是加入數據庫的同類別記錄的流水號遞增的數值。排序索引是排序方法的ID號。流水號原則上是向上累加,并且從1開始,0表示無效,這與排序記錄的修改有關,當加到0xFFFF時,再去查找并使用以前刪除掉的記錄的流水號,就是說已經刪除掉的記錄流水號可以再次利用,但是一個記錄一旦創建,其記錄ID號終生不變,并且要按照記錄ID號中的流水號來建立排序表。
3 系統功能實現
由于每個數據庫[12-15]記錄有一個目錄屬性,表明該記錄屬于哪個目錄,目錄實際上是記錄的歸類信息。目錄本身也當作記錄存儲在數據庫中,目錄作為記錄他也有一個所屬目錄的屬性,表明自己的父目錄,由此可見整個是一個樹狀結構,數據記錄是葉子節點,樹根是sysdb。一個數據庫的根目錄沒有記錄和他對應,定義根目錄的記錄ID等于0。本文數據庫流程圖如圖1所示。
4 系統測試
本文通過上位機和下位機測試兩種方式:同時按下電源開關鍵(掛斷鍵)和退出鍵(右功能鍵)用傳輸線將小機同PC連接起來:在PC端啟動“數據庫測試程序”,小機端:按開關鍵開機連接成功后,在PC端選擇“系統自檢”。首先進行串口測試如圖2所示,同時分別測試串口0和串口1,并顯示測試結果。在測試夾具上,將會將串口0和串口1短接,故各串口自發自收,自動判斷測試結果如圖2所示。
對于所有記錄,系統將自動加入一個時間戳,來表示記錄建立或修改的時間。增加、修改、刪除一條數據記錄,系統將自動修有的數據排序記錄。同樣,增加、修改、刪除一條目錄記錄,系統將自動修改所有的目錄排序記錄。排序記錄的時間戳是做后修改的時間,數據或目錄記錄得時間戳是記錄建立的時間,在系統自檢過程前完成所有數據庫的創建和記錄,如圖3所示。
通過系統軟件測試,表明通過設置系統索引表和系統ID編碼使得數據庫系統同時存取速度提高,且系統可靠性也得到了增強。
5 總結
Nucleus作為開放嵌入式系統,具有實時性和多任務性,系統資源的調度都在其有效管理控制下可以使嵌入式多任務的開發變得省時和省力,同時高效率,本文分析了基于Nucleus的嵌入式數據庫系統索引表的機理和重新定義了ID編碼,,對于嵌入式實時操作系統的開發具有重要的意義,下一步將對在系統掉電情況下的數據庫保護進行研究。
參考文獻
[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操作系統實現TCP和UDP協議通信[J].軟件工程,2018,21(9):29-33.
[4] 段亞林,謝永斌.基于Nucleus的通信終端中AT指令模塊的設計與實現[J].計算機測量與控制,2015,23(11):3744-3746.
[5] 陳連坤.嵌入式系統的設計與開發[M].北京:清華大學出版社,2005.
[6] 臺灣廣達微電子設計有限公司.基帶處理器手冊[M].臺灣:臺灣廣達微電子設計有限公司,2007.
[7] Douglas Boling. Microsoft Windows CE 程序設計[M]. 北京:北京大學出版社,1999.
[8] 蔡志明,盧傳富,李立夏.精通Qt4編程[M].北京:電子工業出版社,2008.
[9] 汪兵,李存斌. EVC高級編程及其應用開發(Embedded Visual C++嵌入式編程)[M].北京:中國水利水電出版社,2005.
[10] 繼剛. 面向智能手機的嵌入式實時操作系統[J].中興通訊技術,2005,16(4):97-99.
[11] 彭濤.嵌入式操作系統移植技術研究[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] 魏振華.嵌入式實時操作系統Nucleus中線程控制部件的實現[J]. 計算機應用與研究,2003 ,16(4):97-99.
(收稿日期: 2019.10.31)