單片機系統的數據存儲和管理
假設在前文所述的大容量測試系統中,系統采用16位地址的單片機,利用分頁存儲模式對512KB掉電保護存儲器進行訪問。將存儲器分為16個頁面(00H~0FH),每個頁面地址為0000H~7FFFFH,共計32KB。此時系統利用malloc()可以在未被使用的空間中開辟一段存儲空間,但是該函數返回的地址指針是隨機的,有可能將空間分配在系統無法識別的區(qū)間(如7FFFH~FFFFH),因此不能滿足需要。另外,由于系統中存儲器具有掉電保護功能,CPU在重新上電后將無法識別已保存測試數據的存儲空間,從而使malloc()函數失去意義。因此,還是以數據引導表為基礎來建立存儲空間的管理函數。其具體功能的實現都依賴于函數對數據引導表中各個記錄的操作,程序如下:
?。觯铮椋洹。恚撸幔欤欤铮悖ǎ酰椋睿簦螅椋澹酰悖瑁幔颍穑幔纾澹_辟存儲空間的函數
?。觯铮椋洹。恚撸妫颍澹澹ǎ觯铮椋洌洌幔簦幔穑撸妫颍澹?,ucharpage)//釋放已開辟存儲空間的函數
?。觯铮椋洹。颍澹撸幔欤欤铮悖ǎ觯铮椋洌洌幔簦幔穑撸颍?,uintsize,ucharpage)//重新開辟存儲空間的函數
以m_alloc()函數為例,其程序流程圖如圖2所示。
圖2 開辟存儲空間函數m_alloc()的程序流程
當系統需要為某一結點開辟存儲空間時,首先給出指定的存儲空間頁面page和需要開辟空間的長度size,然后通過m_alloc()函數在相應頁面的引導表內查詢是否有合適的存儲空間。由于引導表中每個記錄都代表一段已被分配的連續(xù)的地址區(qū)間,因此m_alloc()函數會從第一個記錄開始判斷每兩個相鄰記錄之間未被分配空間的長度是否滿足系統的需要。當有一對記錄滿足條件時,m_alloc()函數會返回該段未被分配存儲空間的首地址(即前一個記錄的末地址)指針,同時在這兩個記錄中間插入此次開辟空間段的新記錄。如果該頁面引導表的所有記錄都不滿足條件,則m_alloc()函數返回空指針。re_alloc()函數和m_free()函數分別完成重新分配指定首地址的一段存儲空間和刪除指定首地址的一段存儲空間的操作。其功能和用法與m_alloc()類似,不再贅述。
鏈式存儲結構和存儲管理系統在實際操作中的應用
利用上文所述的存儲管理系統可以實現在大容量測試系統中應用鏈式存儲結構,這樣做的好處在于能夠有效地簡化系統存儲數據的過程,有利于執(zhí)行多項指令操作,提高系統存儲空間的利用率。
SF6密度繼電器校驗系統
如圖3所示,SF6密度繼電器校驗系統由51系列單片機、512KB掉電保護存儲器、打印機、時鐘系統和LCD組成,配有高精度的數字式壓力傳感器和溫度傳感器,可以通過485總線與上位機通信。該系統能夠對不同類型的密度繼電器進行校驗,滿足各種額定參數和接點數目的需要,在校驗過程中實現實時顯示、打印數據等多項功能;對同一繼電器能夠保存多組校驗數據,最多可保存4000多條校驗數據;對于所有的校驗記錄,都可以隨時進行查詢;另外,在與上位機進行通信時,有相應的上位機軟件對下位機系統進行的數據傳輸、存儲器空間查詢和數據刪除等操作。
圖3?。樱疲睹芏壤^電器校驗系統結構框圖
具體來講,SF6密度繼電器校驗系統以SF6密度繼電器作為校驗對象,校驗結果包含SF6氣體的壓力值和溫度值,因此將每個校驗對象的校驗結果抽象為一個數據元素,分別包括該校驗對象的測試信息(如測試日期,繼電器的測試序號、接點數目和額定參數信息)和一組或多組的測量值信息(如校驗次數、報警、閉鎖1、閉鎖2、超壓接點分別動作、返回時的壓力值和溫度值)。系統以每個數據元素為結點建立鏈式存儲結構,并通過上述的管理存儲系統來管理存儲空間的分配,這樣既能保證有效、合理地保存校驗數據,又能很好地實現數據查詢、數據刪除以及與上位機通信等操作,使系統的運行更加高效可靠。
非線性邏輯結構的自動測試系統
當自動測試系統面臨非線性邏輯結構的數據元素時,必須要采取非順序存儲結構來保存數據,此時可以考慮鏈式存儲結構,或者索引存儲結構以及二叉樹等各種非順序存儲結構,但前提條件都是要有一套專門的存儲管理系統來支持。
有了上述的存儲管理系統作基礎,各種非順序存儲結構的應用就成為可能。在設計系統時充分權衡存儲空間的利用率和算法所耗費的時間,就能夠有針對性地應用多種存儲結構并設計出相應的算法,以滿足各種測試對象和測試環(huán)境的要求。
結語
以鏈式結構的形式保存數據和通過數據引導表來管理存儲空間,是應用于大容量單片機測試系統的一種新的數據保存和管理方式。
這種存儲方式既適用于線性邏輯結構測試系統,也適用于非線性邏輯結構測試系統,總體上使得單片機系統在處理多項復雜數據并進行反復保存、查詢和刪除等操作時更加快捷簡便,提高了對有限容量存儲空間的利用率;同時,結構化的數據存儲使得系統的維護和升級更加輕松,實現了系統的結構化管理。
評論