單片機系統的數據存儲和管理
引言
在自動化測試領域里,單片機測試系統憑借其成熟的應用體系,簡單的系統結構以及優良的性價比得到了越來越廣泛的應用。近年來,隨著新的測試對象不斷出現,以及測試手段的不斷發展,測試系統的功能越來越完善,各種應用場合對測試系統的要求也日益提高。現在的大多數測試系統不僅要完成工業現場的實時測控任務,同時還要進一步實現對測試數據的實時處理和保存。以往在一般的單片機測試系統中,信息的存儲量并不大,系統只須用較少的資源就能實現數據的存儲。但是隨著存儲芯片技術的不斷發展,適用于單片機系統的存儲芯片已經可以在掉電保護的情況下保存上百KB甚至幾MB的數據;同樣,目前的單片機測試系統也面臨動輒處理并保存上千條乃至近萬條測試數據的問題。這對一般的缺少操作系統支持的單片機測試系統來說,是一項相當復雜的工作,因而目前的測試系統往往只能針對具體數值對象進行處理,對大量采集數據采取簡單的順序存儲方式。顯然,這種方法缺少靈活性,不利于單片機測試系統處理大量測試數據,限制了測試系統在這方面的發展。
本文主要針對處理測試數據量較大的一類測試系統,討論測試數據的存儲和管理問題。這類測試系統往往由抗干擾能力較強的單片機和大容量、掉電保護的存儲芯片組成,同時配有高精度數字式傳感器;造價便宜,性能穩定,適合工作在工業現場,保存和處理大量測試數據,有的甚至能夠與上位機組成測控網絡完成更為復雜的測試任務。本文將介紹一種應用于單片機測試系統的鏈式存儲方式,能夠在工業現場進行實時測控的同時,實現對大量測試數據的保存和管理,在實際應用中取得了良好的效果。
大容量單片機測試系統中的存儲結構
在大多數自動測試系統中,測試數據的邏輯結構一般都會遵循線性邏輯關系,即數據元素在時間或者空間順序上只分先后次序而不存在上下層次。因此在設計存儲結構時往往采用順序存儲結構,其優點在于處理線性數據結構時速度快,而且結構簡單。
但是上述情況在前文所述的大容量測試系統中并不是普遍適用的。大容量測試系統雖然同樣是線性邏輯結構,但其測試數據變化多樣,構成數據元素的內部結構也非常復雜,而且系統又要執行數據保存和數據查詢等多項指令操作,如果再應用順序存儲結構就會面臨許多問題。
首先,測試系統經常會面臨一些較為特殊的測試對象。其測試信息較為復雜且數據長度不固定,顯然不利于采用順序存儲結構。假設系統按照時間或空間上的邏輯順序來進行順序存儲,那么對存儲空間的分配將成為難題。若分配空間過大,則影響存儲效率;反之,又會出現數據溢出的情況。類似地,假設系統能夠安排好數據的存放空間,在進行數據查詢、數據刪除等操作時系統也會顯得力不從心。
其次,采用順序存儲結構不能很好地處理抽象數據類型。系統在進行數據保存、數據查詢以及數據刪除等操作時都要考慮數據元素的長度和內容,不能做到靈活、有效。當系統需要修改或升級時,對數據元素內部結構的修改又會影響到系統的整體操作,從而降低了系統的可靠性和高效性,同時使得系統進行維護和升級的難度大大增加。
綜上所述,順序存儲結構并不能解決大容量測試系統在存儲和管理數據時面臨的所有問題,因此在實際操作中必須考慮非順序存儲結構的應用。長久以來,在單片機系統中較少采用諸如鏈式存儲結構等非順序存儲結構,原因在于鏈式存儲結構必須有一套專門的存儲管理系統來支持。在通用計算機中,這一功能由操作系統或高級語言的編譯系統來實現,但在普通單片機系統中沒有成熟的應用案例,因而使程序設計的難度較高。下面介紹一種應用于大容量單片機系統的存儲管理系統,能夠支持大容量單片機測試系統的應用鏈式存儲方式。
大容量測試系統的存儲管理系統
對于采用鏈式存儲結構的大容量測試系統,鏈表中各結點的物理地址是不固定的。為避免在保存數據時可能出現的存儲空間沖突問題,需要建立專門的存儲管理系統來管理存儲空間的開辟和釋放。其中,數據引導表是存儲管理系統的基礎,負責記錄存儲空間中各個數據元素的存儲信息。利用數據引導表,同時配合實現開辟空間、釋放空間等操作的函數,測試系統能夠實現對大量存儲空間的有效管理。
數據引導表
建立數據引導表,就是建立一種鏈表中各結點與其相應物理地址之間的聯系,規范每個結點對存儲空間的使用。在測試系統中,引導表只是占用存儲空間內劃分的一段固定區域,其記錄對象是一段已被分配占用的連續地址空間的首地址和末地址,標志著保存在存儲空間上的某個結點所分配占用的空間大小,稱為一個“記錄”。各個記錄在引導表中的物理地址是連續的,并且按照每個記錄首地址的大小依次排列。數據引導表工作原理如圖1所示。
圖1 數據引導表工作原理示意圖
在初始狀態時,內存引導表只有2個記錄,表明整個存儲空間的首地址和末地址,此時整個頁面空間沒有存儲任何測試數據。一旦有新的結點需要在這一空間上保存,CPU將為該結點開辟一段連續的存儲區間供其使用,并將該段空間的首地址和末地址作為一個記錄寫入內存引導表中。同樣的當系統需要在某一頁面上刪除一個鏈表中的結點時,CPU將其對應的記錄在內存引導表中刪除,以此來釋放此段地址空間。值得說明的是,對于在引導表中被釋放的存儲空間部分,其保存的內容并沒有真正刪除;在新的數據覆蓋該地址之前,CPU還是可以通過直接訪問該地址來讀取其中的存儲數據。
管理存儲空間的函數
一般來講,在通用計算機中往往利用C語言中的標準庫函數malloc()、realloc()和free()來實現對存儲空間的分配和管理,但這種方式對于一般的大容量測試系統并不合適。
評論