張秀芳,劉洲洲
(1.西安歐亞學院,陜西 西安 710065;2.西安工程大學 電信學院,陜西 西安 710000;3.西北工業大學 計算機學院,陜西 西安 710072)
當前嵌入式開放系統已經廣泛應用在各行各業,比如通訊、電子、航空、過程控制、消費電子產品等領域[1-4]。當前嵌入式操作系統有數百種,比較流行的有蘋果iOS,谷歌的安卓系統,ATI的Nucleus Plus、VXWorks等。用戶可以根據自身的軟硬件環境的要求,選擇合適的操作系統。其中數據庫作為系統的關鍵模塊,有至關重要的作用,當前常見的數據庫存儲介質由連續的Flash組成,同時配合驅動和文件管理系統,且邏輯地址空間可逆且連續。文中以嵌入式Nucleus數據庫為例[5-9],設計一種測試軟件架構,采用直接面向Flash驅動的方法,相比傳統存取方法速度有較大提高,內存占用也隨之降低。
Nucleus是為實時嵌入式應用而設計的一個搶先式多任務操作系統[10-12]。Nucleus系統的各層通訊協議都提供了由ANSIC寫成的源碼,有利于系統的可移植性并支持大部分處理器。而且Nucleus系統針對不同的處理器的源碼大部分也是相同的且少部分跟CPU相關由匯編完成。該操作系統完全開源,可以通過修改開源代碼進行所需的配置,調試可以在中斷和寄存器級進行。核心函數API和程序代碼鏈接一起生成目標代碼,可以直接燒制到目標板卡中,整個核心代碼區內核規模非常小,方便調試。
文中提出了面向Flash驅動的數據庫方法,該方法向上提供尋址空間,且空間為線性,將連續且可逆的邏輯地址空間用地址映射表的擦除塊來映射。數據庫相關設備和本身數據庫相互關聯,其中在連續的邏輯地址的基礎上,記錄需要寫在同一個擦除塊,數據庫設備則需要提供動態記錄空間。數據庫設備不能獨立完成整理擦除塊,需要依賴記錄索引,同時設備需要記錄擦除塊的工作情況,使得動態分配空間功能得以完善。擦除塊的掉電保護在底層設備獨立完成,記錄等操作的掉電保護由數據庫系統操作完成。記錄索引表和交換塊以及記錄區構成本數據庫系統,索引表占用首地址空間,而交換塊不占用地址空間且存儲索引表最后節點部分,記錄區占用其他地址空間,詳細記錄每個數據庫地址類別大小等屬性,且記錄唯一地址信息,ID號不沖突同時可區分數據庫類別[13-15]。
文中假定數據庫相關設備存儲大小為2 M,且擦除塊大小占據64 K,擦除塊為32塊,其中一塊作為交換塊,其余為擦除塊,每個擦除塊前四字節寫入ID號和bank號,結構如圖1所示。

圖1 擦除塊結構
當嵌入式開發系統初始化時,數據庫相關設備則開始掃描32塊ID,并動態生成一個映射表且存儲在系統的內存中,由于保留一個交換塊,只可用31節點,定義最后節點地址,其余節點包括物理地址和擦除塊信息。文中映射表用C語言表述成:
struct tagDbDevTab{
long Addr;//物理地址
long Free;//剩余大小
long Dirty;//臟塊大小
}DbDevTab[DB_DEV_SIZE/0x10000];
文中數據庫相關設備可為系統動態分配記錄空間,數據庫記錄表存儲在同一塊擦除塊,且不能夸塊存儲。將地址映射表的空閑字段進行優先分配,減少碎片和物聯塊充分使用,由于操作如刪除和修改等會產生臟塊,為有效利用,臟塊需要反復利用,回收記錄觸發后當設備空間無空余,臟塊回收則選中要回收的目標塊,根據地址映射表記錄字段的大小優先判斷,選定后記錄轉存其他空間同時刪除原記錄。空間所有記錄移除后,調用擦除函數寫入,同時修改地址映射表,如果臟塊太多,需要整塊回收,將有用記錄逐條轉存其他空間后擦除該空間,將保留空間作為邏輯空間寫入記錄,這樣將整個物理空間有效利用。
數據庫系統初始化先由設備初始化再進行數據本身初始化。初始化不但要對調電保護做出檢測和數據修復,還要初始化許多全局變量,它們包括:地址映射表、保留Bank的物理基地址、記錄索引表的最大節點、索引表中已經刪除的節點個數、系統索引的記錄個數等,另外還要打開系統索引。
初始化過程為掃描各個Bank ID,填寫地址映射表的addr字段,如果發現Bank ID的Flag是0xF,則擦掉該Bank,如果發現Bank0 ID是0xE0000000,則改寫為0xC0000000。如果注冊表沒有填寫滿,也就是有的邏輯Bank找不到,則找到一個ID為0xFFFFFFFF的塊,擦除后寫入ID為0xC*******,并作為這個邏輯Bank。找到保留Bank并把基地址寫入地址映射表的最后一個節點。掃描Bank0的記錄索引表的addr字段,如果某個節點的Flag是0xF,改寫為0x8,如果Flag是0xE,讀出該節點id,找出該記錄舊的節點并刪除,同時改寫Flag為0xC。最后統計出記錄索引表的最大節點以及索引表中已經刪除的節點個數。還要統計出各個Bank的已經用掉的空間、剩余空間、臟記錄的空間,其中剩余空間是根據該Bank的最后一條記錄再加上這個記錄的大小算出來一個初始值,然后再從該Bank的最后向前搜索到初始值,遇到不是0xFFFFFFFF的時候退出,該地址就是該Bank的剩余起始地址。
嵌入式開放數據庫設備必須使用掉電保護,目的是嵌入式系統在突發掉電情況,資料完整性得以保存,要求在寫操作步驟進行。首先系統啟動后初始化過程中需要記錄之前掉電現象是正常模式下掉電還是異常模式下掉電,當突發掉電可以還原掉電前資料信息,數據庫的空間地址分別由四個字節信息組成,相關記錄含義目錄名的相關性不得沖突、同時依靠數據庫的魯棒性。
數據庫的掉電保護是指在用戶打開數據庫后,在數據庫的操作期間(關閉數據庫之前)發生低電壓或者突然掉電時應保證數據庫資料的完整性。在這個過程中允許且只允許丟失用戶最后一次的操作。在這個數據庫的實現中,利用了兩套數據文件來保證這一點,每個數據庫打開后同時存在兩套文件:一是(*.dat,*.def.*,*.ida,*.idb,*.idc,...),另一套是(*.dat,*.bef,*.bda,*.bdb.*.bdc,...),其中*.dat是同一個文件。其余的文件兩者一一對應。在數據庫打開時,根據兩套文件的完整性(文件個數)及其相互關系(記錄數的個數)來確定當前使用哪一套文件,并將另外一套文件全部置空(此時這套文件無效)。在對數據庫進行操作的過程中,先將當前這套文件的內容修改后寫入另一套文件中,全部完成后將當前使用的文件標志修改并將原來那套文件全部置空。這樣一來就可以保證在任何時候都有一套完整的數據,在關閉數據庫的時候將空的那一套文件刪除。對于數據庫的保護,在本數據庫系統里數據處理過程中采用備份的方式:兩份數據庫定義文件(*.def,*.bef),兩份索引文件(*.id*,*.bd*),但只有一份數據文件,因為數據塊的使用可以由文件系統保障。這兩份文件組在使用中互為備份:在第一組為當前使用時,執行操作前恢復當前文件組的數據,然后在備份組上進行修改,修改完成,在將當前組指向第二組。
通過上位機和下位機測試兩種方式:同時按下電源開關鍵(掛斷鍵)和退出鍵(右功能鍵)用傳輸線將小機同PC連接起來:在PC端啟動“數據庫測試程序”,小機端:按開關鍵開機連接成功后,在PC端選擇“系統自檢”。首先進行串口測試如圖2所示,同時分別測試串口0和串口1,并顯示測試結果。在測試夾具上,會將串口0和串口1短接,故各串口自發自收,自動判斷測試結果。

圖2 串口通訊
然后再通過SRAM測試和DATA/PROGRAM校驗,如圖3和圖4所示。測試過程中對于數據庫的保護,在本數據庫系統里數據處理過程中采用備份的方式:兩份數據庫定義文件(*.def,*.bef),兩份索引文件(*.id*,*.bd*),但只有一份數據文件,因為數據塊的使用可以由文件系統保障。這兩份文件組在使用中互為備份:在第一組為當前使用時,執行操作前恢復當前文件組的數據,然后在備份組上進行修改,修改完成,再將當前組指向第二組。存儲一條記錄時,首先存貯該記錄的數據,然后存入記錄的節點,最后對該記錄進行排序。針對上述流程,發生掉電時,如果發生在存數據過程,該記錄將完全不存在;如果發生在存節點過程中,該節點將不存在,但會浪費一塊數據文件空間;如果發生在排序過程中,由于記錄數目不一致,將會刪除失效的一套文件。數據庫保持原來的結構。

圖3 SDRAM測試

圖4 DATA/PROGRAM校驗
通過軟件測試,表明該方法便于移植且當其他模塊崩潰時不會直接影響數據庫系統同時存取速度有所提高,同時占用內存也會大大降低,由于有掉電保護,系統可靠性也得到了增強。
Nucleus作為開放嵌入式系統,具有實時性和多任務性,系統資源的調度都在其有效管理控制下可以使嵌入式多任務的開發變得省時省力,同時高效,文中分析了基于Nucleus的嵌入式數據庫測試軟件架構的機理,對于嵌入式實時操作系統的開發具有重要的意義。