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