專利名稱:變長數(shù)據(jù)管理方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式系統(tǒng)的數(shù)據(jù)管理,特別涉及一種可變長度數(shù)據(jù)管理的實現(xiàn)方法和裝置。
背景技術(shù):
目前,隨著嵌入式設(shè)備的發(fā)展,其應(yīng)用的環(huán)境越來越復(fù)雜,隨之產(chǎn)生的需求是對大量存儲數(shù)據(jù)高效的存儲和管理。由于嵌入式終端硬件資源受限,其內(nèi)存容量往往比較小。為了在嵌入式設(shè)備中存儲數(shù)據(jù),現(xiàn)有技術(shù)中提出了一種文件系統(tǒng)。通常情況下,將數(shù)據(jù)存儲在數(shù)據(jù)庫的字段中,是利用嵌入式數(shù)據(jù)庫對存儲器中的數(shù)據(jù)進(jìn)行管理,根據(jù)數(shù)據(jù)庫原理,將需要管理的數(shù)據(jù)歸類細(xì)分為數(shù)據(jù)表、索引和數(shù)據(jù);利用文件系統(tǒng)創(chuàng)建表文件、索引文件和數(shù)據(jù)文件,分別用來管理數(shù)據(jù)表信息、索引信息和數(shù)據(jù)信息。通常,文件系統(tǒng)為上層應(yīng)用提供API函數(shù),用于實現(xiàn)數(shù)據(jù)的添加、修改和刪除操作。嵌入式數(shù)據(jù)庫以表為單位保存在存儲器上,字段是數(shù)據(jù)庫記錄中的一個數(shù)據(jù)單元,變長數(shù)據(jù)即表示字段的數(shù)據(jù)長度是不固定的,會動態(tài)變化。嵌入式設(shè)備中的變長數(shù)據(jù)存儲,通常是為變長數(shù)據(jù)準(zhǔn)備固定大小的內(nèi)存,為了滿足變長數(shù)據(jù)的需要,所述固定長度通常比較大,不論該字段實際使用了多少內(nèi)存,該字段始終會占據(jù)一塊較大的內(nèi)存區(qū),造成內(nèi)存利用率低,浪費(fèi)嚴(yán)重。例如,現(xiàn)有稅控設(shè)備在存儲發(fā)票數(shù)據(jù)時,普遍采用固定長度的數(shù)據(jù)記錄方法,即上述的第一種處理方法。隨著稅收征管的發(fā)展需要,稅控設(shè)備需要記錄長度不固定的發(fā)票數(shù)據(jù),如何在資源有限的硬件條件下實現(xiàn)盡可能高的變長數(shù)據(jù)存儲能力,存儲盡可能多的明細(xì)信息,為發(fā)票防偽提供盡可能多的依據(jù)成為目前稅控設(shè)備急需解決的技術(shù)問題。
發(fā)明內(nèi)容
本發(fā)明的目的在于,解決現(xiàn)有變長數(shù)據(jù)存儲技術(shù)中存儲空間利用率低的技術(shù)問題。為達(dá)到上述目的,本發(fā)明提供一種一種變長數(shù)據(jù)管理方法,所述方法包括變長數(shù)據(jù)存儲方法,步驟為步驟al,將存儲模塊的存儲空間依次劃分為多個相同大小的存儲單元,所述存儲單元的容量定義為單元塊;步驟a2,構(gòu)造數(shù)據(jù)記錄,所述數(shù)據(jù)記錄包括記錄信息和數(shù)據(jù)部分,所述數(shù)據(jù)部分為需要存儲的變長數(shù)據(jù),所述的記錄信息中指明本條數(shù)據(jù)記錄的長度;所述數(shù)據(jù)記錄由多個數(shù)據(jù)塊構(gòu)成;以所述單元塊為單位依次分割所述數(shù)據(jù)記錄, 形成所述多個數(shù)據(jù)塊;步驟a3,存儲所述數(shù)據(jù)記錄,根據(jù)指針模塊提供的地址指針將所述數(shù)據(jù)記錄依次寫入所述存儲模塊的存儲單元;所述地址指針指向所述存儲模塊的第一空地址;步驟a4,更新所述地址指針;寫完所述數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,所述地址指針增加當(dāng)前存儲的數(shù)據(jù)記錄占用存儲空間的長度,指向所述存儲模塊中的第二空地址, 將所述第二空地址寫入指針模塊。本發(fā)明還提供一種變長數(shù)據(jù)管理裝置,由控制模塊和存儲體構(gòu)成;所述存儲體由存儲模塊和指針模塊組成;所述控制模塊分別與所述存儲模塊和所述指針模塊連接;所述存儲模塊存儲數(shù)據(jù)記錄;所述指針模塊中存放一地址指針,所述地址指針指向所述存儲模塊的空地址;所述控制模塊運(yùn)行存取程序,所述存取程序存取變長數(shù)據(jù)記錄,提供其它程序訪問的接口,并初始化所述存儲體,讀取或者擦除所述存儲體;所述控制模塊讀取或者寫入所述指針模塊中的地址指針,根據(jù)所述地址指針指向的地址對所述存儲模塊中的數(shù)據(jù)記錄進(jìn)行查詢、讀寫和刪除操作。本發(fā)明的有益效果在于,存儲器中存儲的變長數(shù)據(jù)記錄首尾相接,連續(xù)存儲??梢栽谟邢薜拇鎯臻g中存儲盡量多的變長數(shù)據(jù),并且能方便進(jìn)行增加、刪除、查詢記錄,不借助任何文件系統(tǒng)和數(shù)據(jù)庫,既節(jié)省了存儲資源,又節(jié)省了處理器資源。
圖1為變長數(shù)據(jù)管理裝置的結(jié)構(gòu)示意圖;圖2為變長數(shù)據(jù)存儲方法的流程圖;圖3為存儲模塊劃分和數(shù)據(jù)記錄存儲的示意圖;圖4為變長數(shù)據(jù)記錄查詢方法的流程圖;圖5為變長數(shù)據(jù)記錄刪除方法的流程圖;圖6為本發(fā)明實施例一的變長數(shù)據(jù)存儲裝置的結(jié)構(gòu)圖;圖7為本發(fā)明實施例一的存儲模塊的物理存儲結(jié)構(gòu)示意圖;圖8為本發(fā)明實施例一的變長數(shù)據(jù)存儲方法的流程圖;圖9為本發(fā)明實施例一的存儲模塊劃分和數(shù)據(jù)記錄存儲的示意圖;圖10為本發(fā)明實施例一的變長數(shù)據(jù)查詢方法的流程圖;圖11為本發(fā)明實施例二的變長數(shù)據(jù)存儲裝置的結(jié)構(gòu)圖;圖12為本發(fā)明實施例二的變長數(shù)據(jù)存儲方法的流程圖;圖13為本發(fā)明實施例二的存儲模塊劃分和數(shù)據(jù)記錄存儲的示意圖;圖14為本發(fā)明實施例二的變長數(shù)據(jù)查詢方法的流程圖。附圖標(biāo)記說明10-變長數(shù)據(jù)管理裝置;11-控制模塊;12-存儲體;121-存儲模塊;122-指針模塊。
具體實施例方式以下結(jié)合附圖,對本發(fā)明技術(shù)方案作進(jìn)一步的詳細(xì)說明,使本發(fā)明的優(yōu)點和特點能更加清楚地呈現(xiàn)。但是本發(fā)明的方法和裝置不受下述實施例的限制,可用各種類似的方式實現(xiàn)。本發(fā)明的思想是提供一種微型、高效的存儲變長數(shù)據(jù)的解決方案,預(yù)先定義變長數(shù)據(jù)記錄的格式,將存儲的變長數(shù)據(jù)整理為特定的數(shù)據(jù)記錄結(jié)構(gòu),使數(shù)據(jù)記錄的長度與存儲器的物理存儲空間相對應(yīng),從而存儲器中存儲的變長數(shù)據(jù)記錄首尾相接,連續(xù)存儲??梢栽谟邢薜拇鎯臻g中存儲盡量多的變長數(shù)據(jù),并且能方便進(jìn)行增加、刪除、查詢記錄,不借助任何文件系統(tǒng)和數(shù)據(jù)庫,既節(jié)省了存儲資源,又節(jié)省了處理器資源。圖1所示為本發(fā)明變長數(shù)據(jù)管理裝置的結(jié)構(gòu)示意圖。變長數(shù)據(jù)管理裝置10包括控制模塊11和存儲體12。存儲體12由存儲模塊121和指針模塊122構(gòu)成??刂颇K11 分別與存儲模塊121和指針模塊122連接。存儲體12為存儲數(shù)據(jù)的載體,例如半導(dǎo)體存儲體FLASH芯片,磁盤等。其中,存儲模塊121用于存儲數(shù)據(jù)記錄。指針模塊122中存放一地址指針,所述地址指針指向存儲模塊 121的某個空地址,當(dāng)存入數(shù)據(jù)記錄時,可從該空地址開始向后寫入,存儲完成后,該地址指針向后延續(xù)到新的空地址。初始狀態(tài)下該地址指針指向存儲模塊121的起始地址??刂颇K11中運(yùn)行存取程序,所述存取程序用于存取變長數(shù)據(jù)記錄,對外提供其它程序訪問的接口,對內(nèi)對存儲體12初始化、讀取或者擦除??刂颇K11讀取或者寫入指針模塊122中的地址指針,根據(jù)所述地址指針指向的地址對存儲模塊121中的數(shù)據(jù)記錄進(jìn)行查詢、讀寫和刪除操作。本發(fā)明的變長數(shù)據(jù)管理方法,包括變長數(shù)據(jù)的存儲、查詢和刪除方法。圖2所示為變長數(shù)據(jù)存儲方法的流程圖,包括步驟201,將存儲模塊121的存儲空間依次劃分為多個相同大小的存儲單元,所述每個存儲單元的容量定義為單元塊;如圖3所示,存儲模塊121的存儲空間依次劃分為多個存儲單元1、存儲單元2、存儲單元3.......步驟202,初始化存儲體12 ;控制模塊11執(zhí)行存取程序,將存儲模塊121全部擦除,將存儲模塊121的起始地址寫入指針模塊122。步驟203,構(gòu)造數(shù)據(jù)記錄;控制模塊11執(zhí)行存取程序,將需要存儲的變長數(shù)據(jù)構(gòu)造成為一條數(shù)據(jù)記錄;所述數(shù)據(jù)記錄包括記錄信息和數(shù)據(jù)部分,所述數(shù)據(jù)部分為需要存儲的變長數(shù)據(jù), 所述的記錄信息中指明本條數(shù)據(jù)記錄的長度;所述數(shù)據(jù)記錄由多個數(shù)據(jù)塊構(gòu)成;以所述單元塊為單位依次分割所述數(shù)據(jù)記錄, 形成所述多個數(shù)據(jù)塊;在第一塊數(shù)據(jù)塊中指定一固定位置為所述記錄信息;所述數(shù)據(jù)記錄的長度為所述數(shù)據(jù)記錄以所述單元塊為單位依次分割產(chǎn)生的數(shù)據(jù)塊的塊數(shù);當(dāng)最后一塊數(shù)據(jù)塊中的數(shù)據(jù)部分不足整個單元塊時,記為一塊單元塊;較佳地,可在最后一塊數(shù)據(jù)塊的尾部增加填充信息,構(gòu)成一塊完整的單元塊。如圖3所示,數(shù)據(jù)記錄A包括第一塊數(shù)據(jù)塊Al、第二塊數(shù)據(jù)塊A2和第三塊數(shù)據(jù)塊 A3,指定第一塊數(shù)據(jù)塊Al的一固定位置為記錄信息All,記錄信息All指明數(shù)據(jù)記錄A的長度為3塊單元塊;數(shù)據(jù)記錄A中除記錄信息All之外的部分為需要存儲的變長數(shù)據(jù);數(shù)據(jù)記錄B包括第一塊數(shù)據(jù)塊Bl、第二塊數(shù)據(jù)塊B2、第三塊數(shù)據(jù)塊B3和第四塊數(shù)據(jù)塊B4,指定第一塊數(shù)據(jù)塊Bl的一固定位置為記錄信息B11,記錄信息Bll指明數(shù)據(jù)記錄B 的長度為4塊單元塊;其中第四塊數(shù)據(jù)塊B4中的數(shù)據(jù)部分不足整個單元塊,在第四數(shù)據(jù)塊 B4尾部增加填充信息B41,構(gòu)成整個單元塊;數(shù)據(jù)記錄B中除記錄信息Bll和填充信息B41 之外的部分為需要存儲的變長數(shù)據(jù)。步驟204,控制模塊11的存取程序從本條數(shù)據(jù)記錄的第一塊數(shù)據(jù)塊的記錄信息中讀取本條數(shù)據(jù)記錄的長度;步驟205,控制模塊11根據(jù)指針模塊122提供的地址指針,將本條數(shù)據(jù)記錄依次寫入存儲模塊121的存儲單元;如圖3所示,數(shù)據(jù)記錄A的數(shù)據(jù)塊Al、A2和A3依次寫入存儲單元1至存儲單元3 ; 數(shù)據(jù)記錄B的數(shù)據(jù)塊Bl、B2、B3和B4依次寫入存儲單元4至存儲單元7。步驟206,更新地址指針;寫完本條數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,地址指針增加當(dāng)前存儲的數(shù)據(jù)記錄占用存儲空間的長度,指向存儲模塊121中的一個空地址,存取程序?qū)⒃摰刂穼懭胫羔樐K122作為新的地址指針;步驟207,控制模塊11判斷是否還需要繼續(xù)存儲;如果是,則執(zhí)行步驟203,如果不是,則執(zhí)行步驟208,結(jié)束。圖4為查詢變長數(shù)據(jù)記錄的方法的流程圖,包括步驟401,控制模塊11定義一檢索地址指針,所述檢索地址指針的初始值為存儲模塊121的起始地址;步驟402,控制模塊11根據(jù)檢索地址指針查詢存儲模塊121,根據(jù)當(dāng)前數(shù)據(jù)記錄的第一塊數(shù)據(jù)塊的記錄信息獲取本條數(shù)據(jù)記錄的長度;步驟403,控制模塊11根據(jù)本條數(shù)據(jù)記錄的長度,依次檢索存儲模塊121中本條數(shù)據(jù)記錄占用的存儲單元,判斷是否符合檢索條件;如果符合條件則讀取本條數(shù)據(jù)記錄,得到查詢結(jié)果;如果不符合條件則執(zhí)行步驟 404 ;步驟404,檢索完本條數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,檢索地址指針增加當(dāng)前檢索的數(shù)據(jù)記錄占用存儲空間的長度;步驟405,判斷檢索地址指針與指針模塊122中當(dāng)前的地址指針是否相同,如果不同,則執(zhí)行步驟402 ;如果相同則結(jié)束,返回?zé)o匹配記錄的信息,表示已存儲的變長數(shù)據(jù)記錄已經(jīng)全部遍歷,但無查詢結(jié)果。圖5為變長數(shù)據(jù)記錄刪除方法的流程圖,包括步驟501,控制模塊11調(diào)用存取程序進(jìn)行查詢,獲取存儲模塊121中將要刪除的數(shù)據(jù)記錄的存儲地址和數(shù)據(jù)記錄的長度;步驟502,控制模塊11調(diào)用存取程序,將存儲模塊121中將要刪除的數(shù)據(jù)記錄占用的存儲單元擦除;步驟503,存取程序?qū)⒅羔樐K122中的地址指針改寫為已刪除的數(shù)據(jù)記錄的起始地址。根據(jù)本發(fā)明的變長數(shù)據(jù)管理方法,將可變長度的數(shù)據(jù)構(gòu)造為具有一定數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)記錄,存儲時連續(xù)占用存儲模塊的存儲空間,使不同長度的數(shù)據(jù)記錄首尾相接,連續(xù)存儲,可以提高存儲空間的使用率,同時提供便捷的查詢和刪除操作。下面結(jié)合具體的實施方式對本發(fā)明的內(nèi)容詳細(xì)描述。實施例一如圖6所示,為本發(fā)明實施例一的變長數(shù)據(jù)存儲裝置的結(jié)構(gòu)圖。本實施例中的存儲體包括三星NAND FLASH芯片,型號為K9F1G08U0M以及存儲芯片ATMCOl。其中K9F1G08U0M作為存儲模塊,存儲數(shù)據(jù)記錄;AT24C01作為指針模塊,存儲地址指針。K9F1G08U0M的1/00 1/07、RE、TO、ALE、CLE管腳分別與控制模塊連接。其中I/ 00 1/07為8個輸入輸出管腳,RE為讀操作控制管腳,WE為寫操作控制管腳,ALE為地址鎖存控制管腳,CLE為命令鎖存控制管腳??刂颇K分別通過控制CLE、ALE、TO、RE管腳的電平,對K9F1G08U0M進(jìn)行控制字操作、地址操作、寫操作或者讀操作。1/00 1/07為數(shù)據(jù)、 地址、命令的復(fù)用端口。向K9F1G08U0M內(nèi)部寫數(shù)據(jù)是基于頁的,K9F1G08U0M的命令字、地址和數(shù)據(jù)都是通過并行口線1/00 1/07在控制信號的作用下分時操作。AT24C01的串行數(shù)據(jù)管腳SDA和串行時鐘管腳SCL分別與控制模塊連接。SDA 可雙向傳送數(shù)據(jù),SCL提供串行時鐘??刂颇K通過SDA讀取或者寫入地址指針,指向 K9F1G08U0M存儲空間的一個空地址。控制模塊中運(yùn)行存取程序,所述存取程序用于存取變長數(shù)據(jù)記錄,對外提供其它程序訪問的接口,對內(nèi)對K9F1G08U0M和ATMCOl初始化、讀取或者擦除。控制模塊讀取或者寫入AT24C01中的地址指針,根據(jù)所述地址指針指向的地址對K9F1G08U0M中的數(shù)據(jù)記錄進(jìn)行查詢、讀寫和刪除操作。K9F1G08U0M容量為U8M字節(jié),分為1024個BLOCK,如圖7所示,每個BLOCK又分為64頁,每頁包含Q048+64)byte。其中每頁的前2048bytes是數(shù)據(jù)區(qū),用于存儲數(shù)據(jù);后 64bytes是空閑區(qū)。K9F1G08U0M的數(shù)據(jù)位為8位。根據(jù)K9F1G08U0M的物理存儲結(jié)構(gòu),將K9F1G08U0M的每頁劃分為4個存儲單元,定義單元塊長為512字節(jié),則K9F1G08U0M的每頁可以存儲4塊數(shù)據(jù)。相應(yīng)地,以“512字節(jié)” 為單位依次分割數(shù)據(jù)記錄,將數(shù)據(jù)記錄的長度記為以所述“512字節(jié)”為單位依次分割產(chǎn)生的數(shù)據(jù)塊的塊數(shù);當(dāng)最后一塊數(shù)據(jù)塊中的數(shù)據(jù)部分不足整個單元塊時,在最后一塊數(shù)據(jù)塊的尾部增加0,構(gòu)成一塊完整的單元塊。并在每條數(shù)據(jù)記錄的第一塊的第3字節(jié)規(guī)定為表示本條數(shù)據(jù)記錄長度的標(biāo)識,單位為塊。控制模塊中運(yùn)行存取程序,將接收到的變長數(shù)據(jù)整理為預(yù)先定義的數(shù)據(jù)記錄格式,長度都是512字節(jié)的整數(shù)倍。對于原數(shù)據(jù)記錄不足512字節(jié)的,按512字節(jié)處理,后面空的位置填補(bǔ)0。貝Ij當(dāng)數(shù)據(jù)記錄比較長時,可以占用多個頁。將ATMCOl的0x00 0x03空間用作存放指向K9F1G08U0M數(shù)據(jù)區(qū)的地址指針, 地址指針定義為4個字節(jié)長度,例如0地址為0x00000000,“Ox”表示十六進(jìn)制表示法。當(dāng) K9F1G08U0M數(shù)據(jù)區(qū)為空時,地址指針指向K9F1G08U0M數(shù)據(jù)區(qū)的起始位置。在每保存一條數(shù)據(jù)記錄后,地址指針都要根據(jù)記錄的實際長度而向后移動。圖8所示為根據(jù)本發(fā)明實施例一的變長數(shù)據(jù)存儲方法的流程圖。包括步驟步驟801,將K9F1G08U0M的存儲空間依次劃分為大小為512字節(jié)的存儲單元,定義為單元塊的大小為512字節(jié);如圖9所示,即將K9F1G08U0M的每頁劃分為4個存儲單元。步驟802,初始化;先調(diào)用NAND FLASH擦除程序?qū)9F1G08U0M的全部BLOCK都擦除,再調(diào)用ATMCOl的擦除程序?qū)⑵淙靠臻g擦除,向ATMCOl的0x00 0x03地址寫入 0x00000000,作為存儲數(shù)據(jù)的初始地址。步驟803,構(gòu)造記錄;控制模塊執(zhí)行存取程序,將需要存儲的變長數(shù)據(jù)構(gòu)造成為一條數(shù)據(jù)記錄,數(shù)據(jù)記錄的長度為512字節(jié)的整數(shù)倍;如圖9所示,數(shù)據(jù)記錄C包括第一塊數(shù)據(jù)塊Cl和第二塊數(shù)據(jù)塊C2,指定第一塊數(shù)據(jù)塊Cl的第3字節(jié)為記錄信息C11,記錄信息Cll指明數(shù)據(jù)記錄C的長度為2塊單元塊; 數(shù)據(jù)記錄C中除記錄信息Cll之外的部分為需要存儲的變長數(shù)據(jù);數(shù)據(jù)記錄D包括第一塊數(shù)據(jù)塊Dl、第二塊數(shù)據(jù)塊D2、第三塊數(shù)據(jù)塊D3和第四塊數(shù)據(jù)塊D4,指定第一塊數(shù)據(jù)塊Dl的第3字節(jié)為記錄信息D11,記錄信息Dll指明數(shù)據(jù)記錄D 的長度為4塊單元塊;其中第四塊數(shù)據(jù)塊D4中的數(shù)據(jù)部分不足整個單元塊,在第四數(shù)據(jù)塊 D4尾部增加填充信息D41 (00000),構(gòu)成整個單元塊;數(shù)據(jù)記錄D中除記錄信息Dll和填充信息D41之外的部分為需要存儲的變長數(shù)據(jù)。步驟804,從本條數(shù)據(jù)記錄的記錄信息中讀取本條數(shù)據(jù)記錄的長度,判斷 K9F1G08U0M當(dāng)前BLOCK的頁的剩余空間是否可以容納本條數(shù)據(jù)記錄;根據(jù)數(shù)據(jù)記錄的塊數(shù)與NAND FLASH當(dāng)前BLOCK的頁的剩余空間折算后的塊數(shù)進(jìn)行比較,判斷數(shù)據(jù)記錄的塊數(shù)是否小于當(dāng)前BLOCK的頁的空閑存儲單元的塊數(shù),如果是,則執(zhí)行步驟805,存儲數(shù)據(jù);如果否,即當(dāng)NAND FLASH的一個BLOCK剩余的頁折算后的塊數(shù)不足以存放本條記錄時,則執(zhí)行步驟806。如圖9所示,數(shù)據(jù)記錄C存儲在BLOCKl的pagel的存儲單元1和存儲單元2。如果當(dāng)前需要存儲的記錄為數(shù)據(jù)記錄D,數(shù)據(jù)記錄D中的記錄信息Dll中指示本記錄長度為4 個單元塊。BLOCKl剩余頁折算后的塊數(shù)可以存儲數(shù)據(jù)記錄D,執(zhí)行步驟805。如圖9所示,數(shù)據(jù)記錄E存儲在BLOCKl的page4的存儲單元1和存儲單元2。如果當(dāng)前需要存儲的記錄為數(shù)據(jù)記錄F,數(shù)據(jù)記錄F中的記錄信息Fl 1中指示本記錄長度為3 個單元塊。BLOCKl的page4僅空閑2個存儲單元,則BLOCKl剩余頁折算后的塊數(shù)不足以存儲數(shù)據(jù)記錄F,執(zhí)行步驟806。步驟805,存儲數(shù)據(jù);將數(shù)據(jù)記錄以追加的方式寫入地址指針指向的位置。從ATMCOl中讀出地址指針,然后從地址指針指向的地址開始依次向K9F1G08U0M 中寫入數(shù)據(jù)記錄。步驟806,將地址指針指向下一 BLOCK的起始位置,將本條數(shù)據(jù)記錄存儲到下一個 BLOCK中,保證任何一條數(shù)據(jù)記錄不跨越兩個BLOCK存儲,這樣做是為了刪除數(shù)據(jù)操作和查詢數(shù)據(jù)操作的方便執(zhí)行。步驟807,將地址指針后移,后移的大小為當(dāng)前存儲的數(shù)據(jù)記錄的長度;將(本條記錄的起始地址+512X本條記錄塊數(shù))的結(jié)果作為新的空地址,寫回到 AT24C01的地址指針存儲區(qū)。步驟808,控制模塊判斷是否繼續(xù)存儲,如果是,則執(zhí)行步驟803,如果不是,則執(zhí)行步驟809,結(jié)束。根據(jù)實施例一的變長數(shù)據(jù)查詢方法,是從K9F1G08U0M的0地址開始,按照變長記錄的每一條首地址依次跳躍,逐一檢索每條數(shù)據(jù)記錄,直到找到符合條件的數(shù)據(jù),當(dāng)檢索地址跳躍到了與當(dāng)前地址指針記錄的地址相等時,表示已有變長記錄數(shù)據(jù)已經(jīng)全遍歷但沒結(jié)^ ο圖10為根據(jù)實施例一的查詢變長數(shù)據(jù)記錄的方法的流程圖,包括步驟1001,控制模塊定義一檢索地址指針,所述檢索地址指針的初始值為 K9F1G08U0M存儲空間的起始地址;步驟1002,控制模塊根據(jù)檢索地址指針查詢K9F1G08U0M,判斷當(dāng)前的存儲空間是否為空閑,如果否,則執(zhí)行步驟1003,如果是,則執(zhí)行步驟1004 ;步驟1003,根據(jù)當(dāng)前數(shù)據(jù)記錄的第一塊數(shù)據(jù)塊的記錄信息獲取本條數(shù)據(jù)記錄的長度;步驟1004,將檢索地址指針指向下一 BLOCK的起始位置;步驟1005,控制模塊根據(jù)本條數(shù)據(jù)記錄的長度,依次檢索K9F1G08U0M中本條數(shù)據(jù)記錄占用的存儲單元,判斷是否符合檢索條件;如果符合條件則讀取本條數(shù)據(jù)記錄,得到查詢結(jié)果;如果不符合條件則執(zhí)行步驟 1006 ;步驟1006,檢索完本條數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,檢索地址指針增加當(dāng)前檢索的數(shù)據(jù)記錄占用存儲空間的長度,將(本條記錄的起始地址+512X本條記錄塊數(shù))作為新的檢索地址指針;步驟1007,判斷檢索地址指針與ATMCOl中當(dāng)前的地址指針是否相同,如果不同, 則執(zhí)行步驟1002 ;如果相同則結(jié)束,返回?zé)o匹配記錄的信息,表示已存儲的變長數(shù)據(jù)記錄已經(jīng)全部遍歷,但無查詢結(jié)果。根據(jù)實施例一的變長數(shù)據(jù)刪除方法,是按照NAND FLASH K9F1G08U0M的BLOCK執(zhí)行,將要刪除的變長數(shù)據(jù)記錄所在的BLOCK擦除,然后將該BLOCK的首地址寫入ATMCOl的 0x00 0x03。實施例二與實施例一不同的是,實施例二中的存儲模塊為電可擦可編程只讀存儲器 EEPROM(ElectricalIy Erasable Programmable Read-Only Memory)。本實施例中的存儲體包括ATMC10M和ATMC01。其中ATMC10M作為存儲模塊, 存儲數(shù)據(jù)記錄;AT24C01作為指針模塊,存儲地址指針。如圖11所示,為本發(fā)明實施例二的變長數(shù)據(jù)存儲裝置的結(jié)構(gòu)圖。AT24C10M和AT24C01都是基于IIC總線協(xié)議,控制模塊通過IIC總線掛接 AT24C1024和ATMCO1。AT24C1024的串行數(shù)據(jù)管腳SDA和串行時鐘管腳SCL分別與控制模塊連接,同樣,AT24C01的串行數(shù)據(jù)管腳SDA和串行時鐘管腳SCL分別與控制模塊連接。控制模塊中運(yùn)行存取程序,根據(jù)時序分別選通ATMC1024和ATMC01。對于指針模塊ATMCO1,控制模塊通過SDA讀取或者寫入地址指針,指向AT24C10M存儲空間的一個空地址。對于存儲模塊ATMC1024,控制模塊通過SDA讀取或者寫入數(shù)據(jù)記錄,根據(jù)ATMC01 中的地址指針,對ATMC1024中的數(shù)據(jù)記錄進(jìn)行查詢、存儲和刪除的操作。AT24C10M可以進(jìn)行“塊”擦寫、編程,也可以進(jìn)行單字節(jié)擦寫、編程操作。在本實施例中,設(shè)置為按字節(jié)擦寫。AT24C10M為串行EEPR0M,存儲容量為U8Kbits,存儲區(qū)由512個page構(gòu)成,每個 page包含有256個byte。根據(jù)ATMC10M的物理存儲結(jié)構(gòu),將ATMC10M的每頁視為1個存儲單元,定義單元塊長為256字節(jié),則ATMC1024的每頁可以存儲1塊數(shù)據(jù)。相應(yīng)地,以“256字節(jié)”為單位依次分割數(shù)據(jù)記錄,將數(shù)據(jù)記錄的長度記為以所述“256字節(jié)”為單位依次分割產(chǎn)生的數(shù)據(jù)塊的塊數(shù);當(dāng)最后一塊數(shù)據(jù)塊中的數(shù)據(jù)部分不足整個單元塊時,在最后一塊數(shù)據(jù)塊的尾部增加0,構(gòu)成一塊完整的單元塊。并在每條數(shù)據(jù)記錄的第一塊的第3字節(jié)規(guī)定為表示本條數(shù)據(jù)記錄長度的標(biāo)識,單位為塊??刂颇K中運(yùn)行存取程序,將接收到的變長數(shù)據(jù)整理為預(yù)先定義的數(shù)據(jù)記錄格式,長度都是256字節(jié)的整數(shù)倍。對于原數(shù)據(jù)記錄不足256字節(jié)的,按256字節(jié)處理,后面空的位置填補(bǔ)0。貝Ij當(dāng)數(shù)據(jù)記錄比較長時,可以占用多個頁。將ATMCOl的0x00 0x03空間用作存放指向AT24C10M數(shù)據(jù)區(qū)的地址指針,地址指針定義為4個字節(jié)長度,例如0地址為0x00000000,“Ox”表示十六進(jìn)制表示法。當(dāng) AT24C10M數(shù)據(jù)區(qū)為空時,地址指針指向ATMC10M數(shù)據(jù)區(qū)的起始位置。在每保存一條數(shù)據(jù)記錄后,地址指針都要根據(jù)記錄的實際長度而向后移動。圖12所示為根據(jù)本發(fā)明實施例一的變長數(shù)據(jù)存儲方法的流程圖。包括步驟步驟1201,將ATMC10M的存儲空間依次劃分為大小為256字節(jié)的存儲單元,定義為單元塊的大小為256字節(jié);如圖12所示,即將ATMC1024的每頁視為1個存儲單元。步驟1202,初始化;先調(diào)用擦除程序?qū)T24C10M和AT24C01的全部空間擦除,向 AT24C01的0x00 0x03地址寫入0x00000000,作為存儲數(shù)據(jù)的初始地址。步驟1203,構(gòu)造記錄;控制模塊執(zhí)行存取程序,將需要存儲的變長數(shù)據(jù)構(gòu)造成為一條數(shù)據(jù)記錄,數(shù)據(jù)記錄的長度為256字節(jié)的整數(shù)倍;如圖13所示,數(shù)據(jù)記錄G包括第一塊數(shù)據(jù)塊Gl和第二塊數(shù)據(jù)塊G2,指定第一塊數(shù)據(jù)塊Gl的第3字節(jié)為記錄信息G11,記錄信息Gll指明數(shù)據(jù)記錄G的長度為2塊單元塊; 數(shù)據(jù)記錄G中除記錄信息Gll之外的部分為需要存儲的變長數(shù)據(jù);數(shù)據(jù)記錄H包括第一塊數(shù)據(jù)塊Hl、第二塊數(shù)據(jù)塊H2、第三塊數(shù)據(jù)塊H3和第四塊數(shù)據(jù)塊H4,指定第一塊數(shù)據(jù)塊Hl的第3字節(jié)為記錄信息H11,記錄信息Hll指明數(shù)據(jù)記錄H 的長度為4塊單元塊;其中第四塊數(shù)據(jù)塊H4中的數(shù)據(jù)部分不足整個單元塊,在第四數(shù)據(jù)塊 H4尾部增加填充信息H41 (00000),構(gòu)成整個單元塊;數(shù)據(jù)記錄H中除記錄信息Hll和填充信息H41之外的部分為需要存儲的變長數(shù)據(jù)。步驟1204,存儲數(shù)據(jù);將數(shù)據(jù)記錄以追加的方式寫入地址指針指向的位置。從ATMCOl中讀出地址指針,然后從地址指針指向的地址開始依次向AT24C10M 中寫入數(shù)據(jù)記錄。步驟1205,將地址指針后移,后移的大小為當(dāng)前存儲的數(shù)據(jù)記錄的長度;將(本條記錄的起始地址+256X本條記錄塊數(shù))的結(jié)果作為新的空地址,寫回到 AT24C01的地址指針存儲區(qū)。步驟1206,控制模塊判斷是否繼續(xù)存儲,如果是,則執(zhí)行步驟1203,如果不是,則執(zhí)行步驟1207,結(jié)束。根據(jù)實施例二的變長數(shù)據(jù)查詢方法,是從ATMC10M存儲空間的0地址開始,按照變長記錄的每一條首地址依次跳躍,逐一檢索每條數(shù)據(jù)記錄,直到找到符合條件的數(shù)據(jù),當(dāng)檢索地址跳躍到了與當(dāng)前地址指針記錄的地址相等時,表示已有變長記錄數(shù)據(jù)已經(jīng)全遍歷但沒結(jié)果。圖14為根據(jù)實施例二的查詢變長數(shù)據(jù)記錄的方法的流程圖,包括步驟1401,控制模塊定義一檢索地址指針,所述檢索地址指針的初始值為 AT24C1024存儲空間的起始地址;步驟1402,根據(jù)當(dāng)前數(shù)據(jù)記錄的第一塊數(shù)據(jù)塊的記錄信息獲取本條數(shù)據(jù)記錄的長
步驟1403,控制模塊根據(jù)本條數(shù)據(jù)記錄的長度,依次檢索AT24C10M存儲空間中本條數(shù)據(jù)記錄占用的存儲單元,判斷是否符合檢索條件;如果符合條件則讀取本條數(shù)據(jù)記錄,得到查詢結(jié)果;如果不符合條件則執(zhí)行步驟 1404 ;步驟1404,檢索完本條數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,檢索地址指針增加當(dāng)前檢索的數(shù)據(jù)記錄占用存儲空間的長度,將(本條記錄的起始地址+256X本條記錄塊數(shù))作為新的檢索地址指針;步驟1405,判斷檢索地址指針與ATMCOl中當(dāng)前的地址指針是否相同,如果不同, 則執(zhí)行步驟1402 ;如果相同則結(jié)束,返回?zé)o匹配記錄的信息,表示已存儲的變長數(shù)據(jù)記錄已經(jīng)全部遍歷,但無查詢結(jié)果。根據(jù)實施例二的變長數(shù)據(jù)刪除方法,是按照ATMC1024的字節(jié)執(zhí)行擦除,將要刪除的變長數(shù)據(jù)記錄所在的頁擦除,然后將該頁的首地址寫入ATMCOl的0x00 0x03。優(yōu)選地,本發(fā)明可應(yīng)用于稅控收款機(jī)中。稅控收款機(jī)要求能夠可靠存儲大量發(fā)票數(shù)據(jù),因此發(fā)票存儲管理是關(guān)鍵功能。變長是指發(fā)票長度因各發(fā)票頭部和發(fā)票所含信息明細(xì)的不同,占用的存儲空間的大小也不相同。例如,每張發(fā)票所占用的存儲空間為幾百字節(jié)或幾千字節(jié)。使用本發(fā)明的變長數(shù)據(jù)管理方法和裝置,每張發(fā)票構(gòu)成一條數(shù)據(jù)記錄,可變長度的發(fā)票數(shù)據(jù)在存儲器中存儲的位置是首尾相連的,存儲器沒有冗余空間,或者將冗余空間盡可能減少。稅控收款機(jī)不需安裝嵌入式數(shù)據(jù)庫和文件系統(tǒng),并且能方便的進(jìn)行增加、刪除、查詢發(fā)票記錄。雖然本發(fā)明的具體實施中的存儲模塊是以NAND flash和EEPROM為例描述的,但是本發(fā)明變長數(shù)據(jù)存儲方法和裝置的技術(shù)方案也可用于其它有類似操作特性的存儲設(shè)備上。在具體實現(xiàn)時,需根據(jù)本發(fā)明的思想作適應(yīng)性修改。以上所述僅為本發(fā)明的較佳實施例,對本發(fā)明而言僅僅是說明性的,而非限制性的。本專業(yè)技術(shù)人員理解,在本發(fā)明權(quán)利要求所限定的精神和范圍內(nèi)可對其進(jìn)行許多改變, 修改,甚至等效,但都將落入本發(fā)明的保護(hù)范圍內(nèi)。
權(quán)利要求
1.一種變長數(shù)據(jù)管理方法,其特征在于,所述方法包括變長數(shù)據(jù)存儲方法,步驟為 步驟al,將存儲模塊的存儲空間依次劃分為多個相同大小的存儲單元,所述存儲單元的容量定義為單元塊;步驟a2,構(gòu)造數(shù)據(jù)記錄,所述數(shù)據(jù)記錄包括記錄信息和數(shù)據(jù)部分,所述數(shù)據(jù)部分為需要存儲的變長數(shù)據(jù),所述的記錄信息中指明本條數(shù)據(jù)記錄的長度;所述數(shù)據(jù)記錄由多個數(shù)據(jù)塊構(gòu)成;以所述單元塊為單位依次分割所述數(shù)據(jù)記錄,形成所述多個數(shù)據(jù)塊;步驟a3,存儲所述數(shù)據(jù)記錄,根據(jù)指針模塊提供的地址指針將所述數(shù)據(jù)記錄依次寫入所述存儲模塊的存儲單元;所述地址指針指向所述存儲模塊的第一空地址;步驟a4,更新所述地址指針;寫完所述數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,所述地址指針增加當(dāng)前存儲的數(shù)據(jù)記錄占用存儲空間的長度,指向所述存儲模塊中的第二空地址,將所述第二空地址寫入指針模塊。
2.根據(jù)權(quán)利要求1所述的變長數(shù)據(jù)管理方法,其特征在于,所述變長數(shù)據(jù)存儲方法的步驟a2中,所述數(shù)據(jù)記錄的長度為以所述單元塊為單位依次分割所述數(shù)據(jù)記錄產(chǎn)生的數(shù)據(jù)塊的塊數(shù)。
3.根據(jù)權(quán)利要求1所述的變長數(shù)據(jù)管理方法,其特征在于,所述變長數(shù)據(jù)存儲方法的步驟a2中,當(dāng)最后一塊數(shù)據(jù)塊中的數(shù)據(jù)部分不足整個單元塊時,記為一塊單元塊。
4.根據(jù)權(quán)利要求1所述的變長數(shù)據(jù)管理方法,其特征在于,所述變長數(shù)據(jù)存儲方法的步驟a2中,在第一塊數(shù)據(jù)塊中指定一固定位置為所述記錄信息。
5.根據(jù)權(quán)利要求1至4任一項所述的變長數(shù)據(jù)管理方法,其特征在于,還包括變長數(shù)據(jù)查詢方法,步驟為步驟bl,根據(jù)一檢索地址指針查詢所述存儲模塊,根據(jù)所述數(shù)據(jù)記錄的記錄信息獲取所述數(shù)據(jù)記錄的長度;所述檢索地址指針初始值為所述存儲模塊的起始地址;步驟1^2,根據(jù)所述數(shù)據(jù)記錄的長度,依次檢索所述存儲模塊中所述數(shù)據(jù)記錄占用的存儲單元,判斷是否符合檢索條件;步驟b3,檢索完所述數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,所述檢索地址指針增加當(dāng)前檢索的數(shù)據(jù)記錄占用存儲空間的長度;步驟b4,判斷所述檢索地址指針與所述指針模塊中當(dāng)前的地址指針是否相同,如果不同,則執(zhí)行步驟b2 ;如果相同則結(jié)束。
6.根據(jù)權(quán)利要求1至4任一項所述的變長數(shù)據(jù)管理方法,其特征在于,還包括變長數(shù)據(jù)刪除方法,步驟為步驟cl,讀取所述存儲模塊中將要刪除的數(shù)據(jù)記錄的存儲地址和數(shù)據(jù)記錄的長度;步驟c2,將所述將要刪除的數(shù)據(jù)記錄占用的存儲單元擦除;步驟c3,將所述指針模塊中的地址指針改寫為已刪除的數(shù)據(jù)記錄的起始地址。
7.一種變長數(shù)據(jù)管理裝置,其特征在于,由控制模塊和存儲體構(gòu)成;所述存儲體由存儲模塊和指針模塊組成;所述控制模塊分別與所述存儲模塊和所述指針模塊連接;所述存儲模塊存儲數(shù)據(jù)記錄;所述指針模塊中存放一地址指針,所述地址指針指向所述存儲模塊的空地址;所述控制模塊運(yùn)行存取程序,所述存取程序存取變長數(shù)據(jù)記錄,提供其它程序訪問的接口,并初始化所述存儲體,讀取或者擦除所述存儲體;所述控制模塊讀取或者寫入所述指針模塊中的地址指針,根據(jù)所述地址指針指向的地址對所述存儲模塊中的數(shù)據(jù)記錄進(jìn)行查詢、讀寫和刪除操作。
8.根據(jù)權(quán)利要求7所述的變長數(shù)據(jù)管理裝置,其特征在于,所述存儲模塊的存儲空間依次劃分為多個相同大小的存儲單元,所述存儲單元的容量定義為單元塊。
9.根據(jù)權(quán)利要求8所述的變長數(shù)據(jù)管理裝置,其特征在于,所述數(shù)據(jù)記錄包括記錄信息和數(shù)據(jù)部分,所述數(shù)據(jù)部分為需要存儲的變長數(shù)據(jù),所述的記錄信息中指明本條數(shù)據(jù)記錄的長度;所述數(shù)據(jù)記錄由多個數(shù)據(jù)塊構(gòu)成;以所述單元塊為單位依次分割所述數(shù)據(jù)記錄,形成所述多個數(shù)據(jù)塊。
10.根據(jù)權(quán)利要求9所述的變長數(shù)據(jù)管理裝置,其特征在于,所述數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊中的數(shù)據(jù)部分不足整個單元塊時,記為一塊單元塊。
全文摘要
一種變長數(shù)據(jù)管理方法,包括變長數(shù)據(jù)存儲方法,步驟為將存儲模塊的存儲空間依次劃分為多個相同大小的存儲單元;構(gòu)造數(shù)據(jù)記錄,所述數(shù)據(jù)記錄包括記錄信息和數(shù)據(jù)部分,所述數(shù)據(jù)部分為需要存儲的變長數(shù)據(jù),所述的記錄信息中指明本條數(shù)據(jù)記錄的長度;存儲所述數(shù)據(jù)記錄,根據(jù)指針模塊提供的地址指針將所述數(shù)據(jù)記錄依次寫入所述存儲模塊的存儲單元;更新所述地址指針,寫完所述數(shù)據(jù)記錄的最后一塊數(shù)據(jù)塊后,所述地址指針指向所述存儲模塊中的第二空地址,將所述第二空地址寫入指針模塊。一種變長數(shù)據(jù)管理裝置,由控制模塊和存儲體構(gòu)成;所述存儲體由存儲模塊和指針模塊組成;所述控制模決分別與所述存儲模塊和所述指針模塊連接。
文檔編號G06F12/06GK102169460SQ20101011554
公開日2011年8月31日 申請日期2010年2月26日 優(yōu)先權(quán)日2010年2月26日
發(fā)明者張平, 李利, 楊大勇, 甘景全, 賀毅 申請人:航天信息股份有限公司