專利名稱::一種在嵌入式系統(tǒng)中存儲、讀取數(shù)據(jù)的方法及裝置的制作方法
技術(shù)領域:
:本發(fā)明涉及計算機領域,特別涉及一種在嵌入式系統(tǒng)中存儲、讀取數(shù)據(jù)的方法及裝置。
背景技術(shù):
:隨著處理器芯片的發(fā)展,嵌入式系統(tǒng)的功能越來越強大,因此對存儲器的穩(wěn)定性和可重復擦寫的要求也越來越高;現(xiàn)有嵌入式系統(tǒng)中的存儲芯片,如串行外設接口存儲(SPIflash,SerialPeripheralInterfaceFlash)芯片具有體積小、容量大、功耗低和硬件接口簡單等特點,該存儲芯片支持頁擦寫和塊擦寫功能,每塊區(qū)域支持100000次擦寫(部分Flash芯片支持更多擦寫次數(shù)),使用壽命為十年左右;但是由于部分嵌入式系統(tǒng)需要在一分鐘內(nèi)多次擦寫Flash的同一塊存儲區(qū)域,雖然該存儲芯片的最大擦寫次數(shù)為十萬次,但也可能會在短時間內(nèi)損壞從而破壞嵌入式設備的正常工作;另外,部分嵌入式系統(tǒng)使用文件系統(tǒng)用來記錄數(shù)據(jù)的存儲狀態(tài)以方便數(shù)據(jù)查詢,但是現(xiàn)有的文件系統(tǒng)對于數(shù)據(jù)的存儲并沒有采用任何放置多次重復擦寫的存儲策略,因此現(xiàn)有嵌入式系統(tǒng)中芯片的存儲穩(wěn)定性具有很大的隱患。
發(fā)明內(nèi)容本發(fā)明提供一種在嵌入式系統(tǒng)中存儲、讀取數(shù)據(jù)的方法,用于提高嵌入式芯片的存儲性能和查詢性能以及延長嵌入式芯片的使用時間。本發(fā)明提供如下技術(shù)方案一種在嵌入式系統(tǒng)中存儲數(shù)據(jù)的方法,包括步驟獲取待存儲的數(shù)據(jù)及其有效記錄數(shù)、擦寫頻率和每條記錄的大??;根據(jù)所述有效記錄數(shù)和擦寫頻率分別確定所述數(shù)據(jù)需要占用的存儲空間大小,進一步根據(jù)所述存儲空間大小分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,并按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間;以及將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置。從數(shù)據(jù)存儲隊列中獲取待存儲的數(shù)據(jù),其中,在系統(tǒng)上電時創(chuàng)建所述數(shù)據(jù)存儲隊列。當待存儲的數(shù)據(jù)大小大于所述數(shù)據(jù)存儲隊列所能裝栽的最大數(shù)據(jù)大小時,動態(tài)增加所述數(shù)據(jù)存儲隊列的空間,并在數(shù)據(jù)寫入所述嵌入式芯片后釋放所述數(shù)據(jù)存儲隊列增加的空間。在所述嵌入式芯片初次運行時創(chuàng)建數(shù)據(jù)跟蹤結(jié)構(gòu)表。所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中包括數(shù)據(jù)的靜態(tài)屬性信息和動態(tài)存儲信息,其中,所述靜態(tài)屬性信息保存在所述嵌入式芯片中,所述動態(tài)存儲信息在嵌入式設備運行后保存在系統(tǒng)內(nèi)存中。系統(tǒng)每次復位后從所述嵌入式芯片中獲取不同數(shù)據(jù)對應的靜態(tài)屬性信息,并根據(jù)該靜態(tài)屬性信息初始化所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中的動態(tài)存儲信息。所述靜態(tài)屬性信息包括數(shù)據(jù)名稱、需要的扇區(qū)總數(shù)、需要存儲的最大記錄數(shù)目、每條記錄的大小和扇區(qū)映射表。所述扇區(qū)映射表包括扇區(qū)邏輯編號、扇區(qū)物理編號和校驗碼。所述動態(tài)存儲信息包括所述數(shù)據(jù)在所述嵌入式芯片中的當前寫入位置、當前讀取位置和當前存儲扇區(qū)使用的狀態(tài)信息。在所述嵌入式芯片的扇區(qū)發(fā)生損壞時,分配相應的空閑扇區(qū)代替損壞的扇區(qū),并將所述損壞的扇區(qū)和所述空閑扇區(qū)的信息分別記錄到所述數(shù)據(jù)跟蹤結(jié)構(gòu)中。一種在嵌入式系統(tǒng)中讀取數(shù)據(jù)的方法,包括步驟根據(jù)查詢數(shù)據(jù)的請求獲取待查詢數(shù)據(jù)的數(shù)據(jù)名稱;在記錄數(shù)據(jù)存儲位置的數(shù)據(jù)跟蹤結(jié)構(gòu)表中確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的存^f諸位置;在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù)。所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中包括數(shù)據(jù)的靜態(tài)屬性信息和動態(tài)存儲信息,其中,所述靜態(tài)屬性信息保存在所述嵌入式芯片中,所述動態(tài)存儲信息在嵌入式設備運行后保存在系統(tǒng)內(nèi)存中。所述靜態(tài)屬性信息包括數(shù)據(jù)名稱、需要的扇區(qū)總數(shù)、需要存儲的最大記錄數(shù)目、每條記錄的大小和扇區(qū)映射表。所述扇區(qū)映射表包括扇區(qū)邏輯編號、扇區(qū)物理編號和才交驗碼。所述動態(tài)存儲信息包括所述數(shù)據(jù)在所述嵌入式芯片中的當前寫入位置、當前讀取位置和當前存儲扇區(qū)使用的狀態(tài)信息。一種數(shù)據(jù)管理裝置,包括用于根據(jù)有效記錄數(shù)和擦寫頻率分別確定所述數(shù)據(jù)需要占用的存儲空間大小,進一步根據(jù)所述存儲空間大小分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,并按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間的單元;用于將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置的單元;用于在記錄數(shù)據(jù)存儲位置的數(shù)據(jù)跟蹤結(jié)構(gòu)表中確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的存儲位置的單元;用于在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù)的單元。一種嵌入式系統(tǒng),包括嵌入式芯片,用于存儲數(shù)據(jù);數(shù)據(jù)管理模塊,用于向所述嵌入式芯片存儲數(shù)據(jù)或查詢數(shù)據(jù),根據(jù)數(shù)據(jù)的有效記錄數(shù)和擦寫頻率分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間,并將數(shù)據(jù)存儲到所述存儲空間后在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置,以及根據(jù)所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中數(shù)據(jù)記錄的存儲位置讀取數(shù)據(jù)。所述數(shù)據(jù)管理模塊包括用于根據(jù)有效記錄數(shù)和擦寫頻率分別確定所述數(shù)據(jù)需要占用的存儲空間大小,進一步根據(jù)所迷存儲空間大小分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,并按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間的單元;用于將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置的單元;用于在記錄數(shù)據(jù)存儲位置的數(shù)據(jù)跟蹤結(jié)構(gòu)表中確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的存儲位置的單元;用于在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù)的單元。本發(fā)明有益效果如下本發(fā)明中按照最大的扇區(qū)需求為數(shù)據(jù)分配存儲空間,提高了嵌入式芯片的存儲性能,也減少了嵌入式芯片固定區(qū)域#^復擦寫的概率,因此延長了嵌入式芯片的使用時間;本發(fā)明中將存儲在嵌入式芯片中的數(shù)據(jù)的存儲信息記錄在數(shù)據(jù)跟蹤結(jié)構(gòu)表中,根據(jù)所述存儲信息可以方便地向嵌入式芯片實現(xiàn)數(shù)據(jù)的查詢,提高了嵌入式系統(tǒng)的數(shù)據(jù)查詢效率。圖1為本發(fā)明實施例中一種嵌入式系統(tǒng)結(jié)構(gòu)示意圖;圖2A為本發(fā)明實施例中寫入模塊結(jié)構(gòu)示意圖;圖2B為本發(fā)明實施例中讀取^莫塊結(jié)構(gòu)示意圖;圖3為本發(fā)明實施例中在嵌入式系統(tǒng)中存儲數(shù)據(jù)的主要實現(xiàn)流程圖;圖4為本發(fā)明實施例中初始化數(shù)據(jù)跟蹤結(jié)構(gòu)表和數(shù)據(jù)存儲隊列的實現(xiàn)流程圖;圖5為本發(fā)明實施例中循環(huán)向嵌入式芯片存儲數(shù)據(jù)的具體實現(xiàn)流程圖;圖6為本發(fā)明實施例中數(shù)據(jù)在嵌入式芯片中的存儲結(jié)構(gòu)示意圖;圖7為本發(fā)明實施例中在嵌入式系統(tǒng)中讀取數(shù)據(jù)的主要實現(xiàn)流程圖。具體實施方式本實施例中將待存儲的數(shù)據(jù)分配多于實際需求量的存儲空間,在保證數(shù)據(jù)不丟失和嵌入式芯片存儲空間足夠的前提下,盡可能的為需要存儲的數(shù)據(jù)分配多一些的存儲空間,使得數(shù)據(jù)能夠均勻的分散存儲在嵌入式芯片的各個扇區(qū)中,另外,為了更好的管理存儲在嵌入式芯片中的數(shù)據(jù),本實施例將數(shù)據(jù)在芯片中的存儲信息記錄在數(shù)據(jù)跟蹤結(jié)構(gòu)表中,通過該數(shù)據(jù)跟蹤結(jié)構(gòu)表跟蹤數(shù)據(jù)存儲在嵌入式芯片中的扇區(qū)位置,并從所述扇區(qū)的相應位置讀取數(shù)據(jù)。本實施例中一種嵌入式系統(tǒng)結(jié)構(gòu)如圖1所示,該系統(tǒng)包括應用模塊10、數(shù)據(jù)管理模塊11和嵌入式芯片12;所述數(shù)據(jù)管理模塊114艮據(jù)所述應用模塊10輸出的待處理的數(shù)據(jù)以及處理該數(shù)據(jù)的請求向所述嵌入式芯片12存儲數(shù)據(jù)或查詢數(shù)據(jù)。所述應用模塊10包括配置管理單元100、數(shù)據(jù)核心單元101和數(shù)據(jù)交互單元102;所述配置管理單元IOO用于描述應用程序的配置信息(如信號名稱、信號單位和信號比例等信息);所述數(shù)據(jù)核心單元101用于處理采集到的數(shù)據(jù),并向所述數(shù)據(jù)管理模塊11輸出所述數(shù)據(jù)并請求處理所述數(shù)據(jù);所述數(shù)據(jù)交互單元102用于與其他應用模塊(如協(xié)議模塊)進行數(shù)據(jù)交互,并記錄交互過程中的相關信息。所述數(shù)據(jù)管理模塊11用于通過數(shù)據(jù)跟蹤結(jié)構(gòu)表和數(shù)據(jù)存儲隊列管理存儲的數(shù)據(jù),并根據(jù)應用模塊10的請求在嵌入式芯片中對獲取的待處理的數(shù)據(jù)執(zhí)行相應的操作;包括數(shù)據(jù)交互接口110用于提供應用模塊10與數(shù)據(jù)管理模塊11之間進行數(shù)據(jù)交互的接口;數(shù)據(jù)跟蹤模塊113用于存儲記錄數(shù)據(jù)存儲信息的數(shù)據(jù)跟蹤結(jié)構(gòu)表;寫入模塊111用于將應用模塊10傳入的數(shù)據(jù)存儲到嵌入式芯片12中,并更新數(shù)據(jù)跟蹤結(jié)構(gòu)表和數(shù)據(jù)存儲隊列;讀取模塊112用于響應應用模塊10的讀取請求,根據(jù)數(shù)據(jù)跟蹤結(jié)構(gòu)表獲取相應數(shù)據(jù)在嵌入式芯片12中的存儲位置,并在該存儲位置將數(shù)據(jù)讀出后傳送給應用模塊10;服務模塊114用于監(jiān)測和管理嵌入式芯片12的扇區(qū)使用情況,當某一扇區(qū)損壞時利用芯片中的一個剩余扇區(qū)代替,當沒有空閑扇區(qū)存儲數(shù)據(jù)時擦除一個扇區(qū)以供存儲數(shù)據(jù),當芯片沒有扇區(qū)可以使用時,向應用模塊10通知嵌入式芯片12損壞。如圖2A所示,所述寫入模塊lll進一步包括緩沖單元1110,用于通過數(shù)據(jù)存儲隊列存儲應用模塊IO輸出的待處理的數(shù)據(jù)及其相關屬性信息。扇區(qū)數(shù)目確定單元1111,用于根據(jù)所述數(shù)據(jù)的屬性信息和嵌入式芯片12的屬性信息確定所述數(shù)據(jù)在所述嵌入式芯片12中需要的扇區(qū)數(shù)目。例如,沖艮據(jù)所述數(shù)據(jù)的屬性信息中的的有效記錄數(shù)、每條記錄的大小和嵌入式芯片12的屬性信息中的每個扇區(qū)大小確定所述數(shù)據(jù)需要的扇區(qū)數(shù)目,以及根據(jù)所述數(shù)據(jù)的屬性信息中的數(shù)據(jù)擦寫頻率、每條記錄的大小和嵌入式芯片12的屬性信息中的每個扇區(qū)大小、最大可擦除次數(shù)和最短使用壽命確定所述數(shù)據(jù)需要的扇區(qū)數(shù)目,并將其中最大的扇區(qū)數(shù)目確定為所述數(shù)據(jù)在所述嵌入式芯片12中需要的扇區(qū)數(shù)目。寫入單元1112,用于根據(jù)扇區(qū)數(shù)目確定單元1111確定的扇區(qū)數(shù)目在所述嵌入式芯片12中分配存儲空間,并將所述存儲單元1110中數(shù)據(jù)存儲隊列中的數(shù)據(jù)存儲到所述存儲空間。更新單元1113,用于根據(jù)數(shù)據(jù)的存儲信息更新數(shù)據(jù)跟蹤結(jié)構(gòu)表以及數(shù)據(jù)存儲隊列。如圖2B所示,所述讀取模塊112進一步包括緩沖單元1120,用于接收應用模塊IO發(fā)送的查詢數(shù)據(jù)的請求并存儲請求中攜帶的數(shù)據(jù)名稱,所述數(shù)據(jù)名稱可以是一個字符串名稱。扇區(qū)位置確定單元1121,用于根據(jù)數(shù)據(jù)跟蹤模塊113中的數(shù)據(jù)跟蹤結(jié)構(gòu)表確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片12中的存儲位置。讀取單元1122,用于在嵌入式芯片12中的所述存儲位置讀取數(shù)據(jù)。更新單元1123,用于在數(shù)據(jù)讀取后更新數(shù)據(jù)跟蹤結(jié)構(gòu)表,如記錄數(shù)據(jù)讀取的開始位置、當前位置、或者在某一扇區(qū)多次讀取失敗時記錄該扇區(qū)損壞,不能進行數(shù)據(jù)讀取等。所述數(shù)據(jù)管理模塊11在系統(tǒng)初次運行時在嵌入式芯片12中的靜態(tài)數(shù)據(jù)存儲扇區(qū)中創(chuàng)建數(shù)據(jù)跟蹤結(jié)構(gòu)表中各種數(shù)據(jù)對應的靜態(tài)屬性信息(即固有屬性信息),該信息一直保存在芯片中;在系統(tǒng)運行后將數(shù)據(jù)跟蹤結(jié)構(gòu)表中各種數(shù)據(jù)的動態(tài)存儲信息保存在系統(tǒng)內(nèi)存中;在系統(tǒng)每次復位后數(shù)據(jù)管理模塊11首先讀取靜態(tài)屬性信息,然后根據(jù)該靜態(tài)屬性信息初始化數(shù)據(jù)跟蹤結(jié)構(gòu)表中各種數(shù)據(jù)對應的動態(tài)存儲信息(即數(shù)據(jù)在芯片中的存儲信息)。所述數(shù)據(jù)跟蹤結(jié)構(gòu)表描述了在芯片中存儲的數(shù)據(jù)的靜態(tài)屬性信息和動態(tài)存儲信息,通過該數(shù)據(jù)跟蹤結(jié)構(gòu)表可以方便容易的查詢到存儲在芯片中的數(shù)據(jù);該數(shù)據(jù)跟蹤結(jié)構(gòu)表可以衍生出更多的信息,用來描述所有數(shù)據(jù)在芯片中的存儲特征;因為SPIFlash芯片有它的獨特性,一個扇區(qū)里的數(shù)據(jù)是不能局部擦除的,而是必須以整個扇區(qū)為單元擦除,因此采用追加記錄的方式記錄數(shù)據(jù),即在數(shù)據(jù)跟蹤結(jié)構(gòu)表的結(jié)尾增加一條數(shù)據(jù)實現(xiàn)數(shù)據(jù)的更改。數(shù)據(jù)跟蹤結(jié)構(gòu)表中的靜態(tài)屬性信息包括數(shù)據(jù)名稱、需要的扇區(qū)總數(shù)、需要存儲的最大記錄數(shù)目、每條記錄的大小和扇區(qū)映射表;動態(tài)存儲信息包括所述數(shù)據(jù)在所述嵌入式芯片中的當前寫入位置、當前讀取位置和當前存儲扇區(qū)使用的狀態(tài)信息等;所述數(shù)據(jù)跟蹤結(jié)構(gòu)的信息描述如下typedefstructtagRecordSetTrackcharDataName[LEN_DATA—NAME];/*數(shù)據(jù)名稱長度*/BYTEbyTotalSectors;/*總的扇區(qū)數(shù)*/UnsignedshortiMaxRecords;/*需要保存的最大紀錄數(shù)*/intiRecordSize;/*每條記錄的字節(jié)數(shù)*/〃擦除扇區(qū)預處理需要變量ERASE—SECTOR_PRE—PROCpfn_preProcess;/*擦扇區(qū)預處理函數(shù)*/HANDLEhPreProcess;/*擦扇區(qū)句柄*/voidParams;/*擦扇區(qū)輸入?yún)?shù)*/〃讀記錄的開始記錄號跟蹤變量intiStartRecordNo;/*跟蹤開始讀記錄的記錄號*/BOOLbSectorEffect;/*判斷當前扇區(qū)是否可用,不可用置0*/intiDataRecordIDIndex;/*不同的數(shù)據(jù)在Flash靜態(tài)存儲的記錄標識"ViMaxRecordsPerSectorBYTEbyCurrSectorNo;BYTEbyNewSectorFlag;intiWritableRecords;intiCurrWritePos;intiCurrReadPos;intiCurrRecordID;int,/*當前讀或者寫的邏輯扇區(qū)號*//*當前記錄數(shù)目小于最大記錄數(shù)目/*當前扇區(qū)還能寫入的記錄數(shù)*//*當前扇區(qū)中可寫入記錄的位置*//*當前讀扇區(qū)中的讀位置號*/,/*當前寫入記錄的順序編號索引*/SECTOR—MAP—TABLE*pbyPhysicsSectorNo;/*SECTOR_MAP—TABlTE[byTotalSectors]*/〃用來處S非連續(xù)查詢記錄時候,恢復原來跟蹤信息用BYTEbyOldCurrSectorNo;/*用于保存當前寫扇區(qū)的扇區(qū)號*/}RECORD—SET—TRACK;所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中存儲在嵌入式芯片中的靜態(tài)屬性信息具體格式如表1所示數(shù)據(jù)記錄標識索引數(shù)據(jù)名稱最大記錄條數(shù)每條記錄大小總扇區(qū)數(shù)校驗碼扇區(qū)映射表*64表1其中,扇區(qū)映射表的具體格式如表2所示扇區(qū)邏輯編號扇區(qū)物理編號校驗碼表2由于應用模塊10可能會在較短的時間內(nèi)要求存儲多條數(shù)據(jù),而嵌入式芯片12的數(shù)據(jù)讀寫需要處理時間,所以會出現(xiàn)上層軟件需要記錄而底層硬件(即嵌入式芯片12)卻沒有準備好的情況,從而導致數(shù)據(jù)的丟失。為解決上述問題,本實施例中所述數(shù)據(jù)管理模塊11在系統(tǒng)每次上電時創(chuàng)建數(shù)據(jù)存儲隊列,并將其保存在內(nèi)存中,通過讀取記錄在芯片上的靜態(tài)屬性信息對其進行初始化,所述數(shù)據(jù)存儲隊列用于存放應用模塊10需要存儲的數(shù)據(jù),主要內(nèi)容有記錄索引號、數(shù)據(jù)長度、數(shù)據(jù)條數(shù)和數(shù)據(jù)本體等,當隊列中的數(shù)據(jù)存儲到嵌入式芯片中后,寫入模塊會自動在寫入的數(shù)據(jù)后寫入校驗碼,并重新讀取一次,校驗所寫入的數(shù)據(jù)的校驗碼是否正確,以保證數(shù)據(jù)寫入的正確性。當待寫入的數(shù)據(jù)大小大于數(shù)據(jù)存儲隊列所能裝載的最大數(shù)據(jù)大小時,數(shù)據(jù)管理模塊11則動態(tài)增加數(shù)據(jù)存儲隊列的空間以存儲多余的待寫入數(shù)據(jù),在數(shù)據(jù)寫入嵌入式芯片12后,數(shù)據(jù)管理模塊11將數(shù)據(jù)存儲隊列存儲所述數(shù)據(jù)的空間釋放。所述數(shù)據(jù)存儲隊列可以通過如下代碼創(chuàng)建如圖3所示,本實施例中在嵌入式系統(tǒng)中存儲數(shù)據(jù)的主要實現(xiàn)過程如下步驟300、獲取待存儲的數(shù)據(jù)及其有效記錄數(shù)、擦寫記錄和每條記錄的大步驟301、根據(jù)所述有效記錄數(shù)和擦寫頻率分別確定所迷數(shù)據(jù)需要占用的存儲空間大小,進一步根據(jù)所述存儲空間大小分別確定嵌入式芯片需要提供的扇區(qū)凄丈目。步驟302、按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間。步驟303、將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置。如圖4所示,對數(shù)據(jù)跟蹤結(jié)構(gòu)表和數(shù)據(jù)存儲隊列進行初始化的實現(xiàn)過程如下步驟400、讀取嵌入式芯片中數(shù)據(jù)的靜態(tài)屬性信息。步驟401、判斷靜態(tài)屬性信息中數(shù)據(jù)類型索引是否存在,如果存在,則執(zhí)行步驟402;否則,執(zhí)行步驟404。步驟402、判斷數(shù)據(jù)類型索引是否讀取成功,如果是,則執(zhí)行步驟403;否則,結(jié)束流程。步驟403、獲取歷史數(shù)據(jù)狀態(tài)。步驟404、創(chuàng)建數(shù)據(jù)存儲隊列。步驟405、初始化數(shù)據(jù)存儲隊列。typedefstructtagHISDA.TAQUEUEintilBYTEbiDataRecordIDIndex;blsAlarm;iHead;iLength;iRecordSize;iMaxSize;intintintintvoid在步驟301中,規(guī)劃待存儲數(shù)據(jù)的資源分配時,嵌入式芯片中為待存儲的數(shù)據(jù)分配扇區(qū)個數(shù)越多,在同一區(qū)域被擦寫的次數(shù)相應越少,但是扇區(qū)數(shù)目的增加也會系統(tǒng)更多的查詢時間,因此待存儲數(shù)據(jù)在芯片中存儲空間的占用需要綜合考慮,本實施例中提供了一種計算數(shù)據(jù)需要的扇區(qū)數(shù)目的算法,根據(jù)待存儲數(shù)據(jù)的相關信息(如有效記錄數(shù)、每條記錄大小和數(shù)據(jù)記錄的頻度等)和嵌入式芯片的物理屬性信息(如扇區(qū)最大可擦除次數(shù)、每個扇區(qū)大小和最小使用壽命等)計算數(shù)據(jù)在嵌入式芯片中所需要的扇區(qū)數(shù)目,如表3所示為待存儲數(shù)據(jù)的相關信息和嵌入式芯片的物理屬性信息<table>tableseeoriginaldocumentpage14</column></row><table>表3通過如下公式計算出待存儲數(shù)據(jù)在芯片中需要的存儲空間:Nmsn=MAX(NMSNi,NMSN2)=MAX(ROUNDUP(NTSpY/NSAET,0),ROUNDUP(NTDR*NDRS/NFSS,0)+l)=MAX(ROUNDUP((NTBPY/NFSS)/(NMSEC/T,F),0),ROUNDUP(NTDR*(NDRS+6)/NFSS,O)十l)=MAX(ROUNDUP(((NDRS+6)*FDRF*365/1024/NFSS)/(NMSEC/TMTBF),0),ROUNDUP(NTDR*(NDRS+6)/NFSS,0)+l)(1)其中,區(qū)最大擦寫次數(shù)所確定的需要的扇區(qū)數(shù)目;ROUNDUP(Ntdr*(Ndrs+6)/Nfss,0)+1為根據(jù)需要存儲的最大記錄數(shù)目確定的需要的扇區(qū)數(shù);NDRS+6表示每條記錄實際存儲大小,數(shù)據(jù)記錄標識iCurrRecordID大小為4個字節(jié),校驗碼CheckNo大小為2個字節(jié)。在步驟302中,,i設需要存儲9種數(shù)據(jù),根據(jù)該9種數(shù)據(jù)的存儲時間間隔、數(shù)據(jù)大小和存儲記錄數(shù)按上述公式(1)分別計算數(shù)據(jù)對應需要的存儲空間,如表4所示為該9種數(shù)據(jù)的存儲空間分配表區(qū)域編號數(shù)據(jù)名稱記錄大小(字節(jié))最大記錄條數(shù)大小(比特)Sect_Area2_l靜態(tài)數(shù)據(jù),扇區(qū)映射記錄217502x64kSect—Area2一2歷史數(shù)據(jù)3060002x64kSect_Area2—3歷史告警304002x64kSect—Area2_4統(tǒng)計數(shù)據(jù)4610002x64kSect一Area2一5蓄電池測試記錄5110*18*8011x64kSect_Area2—6控制命令306002x64kSect一Area2—7系統(tǒng)運行曰志1483002x64kSect—Area2_8用戶信息58162x64kSect—Area2_9活動告警165002x64k1728k表4在步驟303中,數(shù)據(jù)管理模塊循環(huán)向嵌入式芯片存儲數(shù)據(jù),其具體實現(xiàn)過程如圖5所示,包括如下步驟步驟500、判斷數(shù)據(jù)存儲隊列中是否存在需要存儲的數(shù)據(jù),如果存在,則執(zhí)行步驟501;否則,執(zhí)行步驟507。步驟501、判斷待存儲數(shù)據(jù)大小是否小于嵌入式芯片的剩余存儲空間,如果是,則執(zhí)行步驟502;否則,執(zhí)行步驟503。步驟502、將待存儲數(shù)據(jù)存儲到嵌入式芯片。步驟503、將待存儲的部分數(shù)據(jù)存儲到嵌入式芯片的剩余存儲空間。步驟504、更新數(shù)據(jù)跟蹤結(jié)構(gòu)表和數(shù)據(jù)存儲隊列。步驟505、判斷數(shù)據(jù)是否已經(jīng)存儲完畢,如果是,則執(zhí)行步驟507;否則,執(zhí)行步驟506。步驟506、獲取嵌入式芯片新的存儲空間,并將待存儲的剩余數(shù)據(jù)存儲到該新的存儲空間。步驟507、判斷應用模塊是否需要退出寫入操作,如果是,則執(zhí)行步驟508;否則,返回步驟500。步驟508、釋放數(shù)據(jù)存儲隊列指針對應的內(nèi)存資源。數(shù)據(jù)在嵌入式芯片中的存儲格式如圖6所示,在每個數(shù)據(jù)記錄中,由扇區(qū)映射表記錄數(shù)據(jù)的存儲位置,所述扇區(qū)映射表的格式如下[邏輯扇區(qū)ID1,物理扇區(qū)ID1,檢驗碼1][邏輯扇區(qū)ID2,物理扇區(qū)ID2,校驗碼2]...[邏輯扇區(qū)IDN,物理扇區(qū)IDN,校驗碼N]邏輯扇區(qū)ID從1到N,N為本數(shù)據(jù)文件需要的實際扇區(qū)數(shù),物理扇區(qū)ID為實際分配給該數(shù)據(jù)的物理扇區(qū)號;每種數(shù)據(jù)分配為64個扇區(qū)映射記錄空間(因為歷史數(shù)據(jù)最多為64個扇區(qū))。初始化時,扇區(qū)映射表只有N項,如下所示數(shù)據(jù)l(N=5):[1,1][2,2][3,3][4,4][5,5]數(shù)據(jù)2(N=2):[1,6][2,7]數(shù)據(jù)3(N-6):[1,8][2,9][3,10][4,11][5,12][5,13][4,15]在每次擦除扇區(qū)后,服務模塊需要檢驗扇區(qū)的好壞,即如果發(fā)現(xiàn)一個扇區(qū)IDi損壞,則找一個剩余扇區(qū)IDm替代,并在扇區(qū)映射表后增加一項[邏輯扇區(qū)IDi,物理扇區(qū)IDm,枱r驗碼i],則扇區(qū)映射表為[邏輯扇區(qū)IDl,物理扇區(qū)ID1,校驗碼1][邏輯扇區(qū)ID2,物理扇區(qū)ID2,校驗碼2]...[邏輯扇區(qū)IDn,物理扇區(qū)IDn,校驗碼n][邏輯扇區(qū)IDi,物理扇區(qū)IDm,校驗碼i]假設上述數(shù)據(jù)1的第2個扇區(qū)損壞,則用第14個扇區(qū)替代,此時有數(shù)據(jù)l(N=5):[1,1][2,2][3,3][4,4][5,5][2,14]假設上述數(shù)據(jù)3的第4個扇區(qū)損壞,則用第15個扇區(qū)替代,此時有數(shù)據(jù)3(N=6):[1,8][2,9][3,10][4,11][5,12][5,13][4,15]使用一段時間后,如果數(shù)據(jù)1的第3個扇區(qū)損壞,則用第16個扇區(qū)替代,此時有數(shù)據(jù)1(N=5):[1,1][2,2][3,3][4,4][5,5][2,14][3,16]如果沒有空閑扇區(qū)可以使用時,服務模塊向應用模塊報告嵌入式芯片錯誤,要求維修。在嵌入式芯片中存儲數(shù)據(jù)的過程中,采用數(shù)組方式來存儲每種數(shù)據(jù)的扇區(qū)映射表,所述數(shù)組可以采用BYTE*pbyPhysicalSector=NEWBYTE[N],依次將扇區(qū)映射表中的各項數(shù)據(jù)讀入到該數(shù)組中,在芯片扇區(qū)讀寫數(shù)據(jù)時按照邏輯扇區(qū)操作,在pbyPhysicalSector中得到物理扇區(qū)號;如將數(shù)據(jù)1的扇區(qū)映射表中的[3,3]讀入到數(shù)組中,此時有pbyPhysicalSectors[3]=3;將數(shù)據(jù)1的扇區(qū)映射表中的[3,16]讀入到數(shù)組中,此時有pbyPhysicalSector[3]=16。如圖7所示,本實施例中在嵌入式系統(tǒng)中讀取數(shù)據(jù)的主要實現(xiàn)流程如下步驟700、根據(jù)查詢數(shù)據(jù)的請求獲取待查詢數(shù)據(jù)的數(shù)據(jù)名稱。步驟701、在記錄數(shù)據(jù)存儲位置的數(shù)據(jù)跟蹤結(jié)構(gòu)表中確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的存儲位置。步驟702、在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù)。本實施例中芯片為待存儲數(shù)據(jù)分配存儲空間時,確定需要提供的存儲空間的方法以及將數(shù)據(jù)在芯片中的存儲信息記錄到數(shù)據(jù)跟蹤結(jié)構(gòu)表,通過該數(shù)據(jù)跟蹤結(jié)構(gòu)表管理和維護數(shù)據(jù)的存儲信息,進一步在芯片中的相應存儲位置讀取數(shù)據(jù),本發(fā)明技術(shù)方案的實現(xiàn)方法不僅適用于SerialPeripheralInterfaceFlash芯片,還適用于其他存儲芯片。明的精神和范圍。這樣,倘若對本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。權(quán)利要求1.一種在嵌入式系統(tǒng)中存儲數(shù)據(jù)的方法,其特征在于,包括步驟獲取待存儲的數(shù)據(jù)及其有效記錄數(shù)、擦寫頻率和每條記錄的大小;根據(jù)所述有效記錄數(shù)和擦寫頻率分別確定所述數(shù)據(jù)需要占用的存儲空間大小,進一步根據(jù)所述存儲空間大小分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,并按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間;以及將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置。2、如權(quán)利要求1所述的方法,其特征在于,從數(shù)據(jù)存儲隊列中獲取待存儲的數(shù)據(jù),其中,在系統(tǒng)上電時創(chuàng)建所述數(shù)據(jù)存儲隊列。3、如權(quán)利要求2所述的方法,其特征在于,當待存儲的數(shù)據(jù)大小大于所述數(shù)據(jù)存儲隊列所能裝載的最大數(shù)據(jù)大小時,動態(tài)增加所述數(shù)據(jù)存儲隊列的空間,并在數(shù)據(jù)寫入所述嵌入式芯片后釋放所述數(shù)據(jù)存儲隊列增加的空間。4、如權(quán)利要求].、2或3所述的方法,其特征在于,在所述嵌入式芯片初次運行時創(chuàng)建數(shù)據(jù)跟蹤結(jié)構(gòu)表。5、如權(quán)利要求4所述的方法,其特征在于,所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中包括數(shù)據(jù)的靜態(tài)屬性信息和動態(tài)存儲信息,其中,所述靜態(tài)屬性信息保存在所述嵌入式芯片中,所述動態(tài)存儲信息在嵌入式設備運行后保存在系統(tǒng)內(nèi)存中。6、如權(quán)利要求5所述的方法,其特征在于,系統(tǒng)每次復位后從所述嵌入式芯片中獲取不同數(shù)據(jù)對應的靜態(tài)屬性信息,并根據(jù)該靜態(tài)屬性信息初始化所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中的動態(tài)存儲信息。7、如權(quán)利要求6所述的方法,其特征在于,所述靜態(tài)屬性信息包括數(shù)據(jù)名稱、需要的扇區(qū)總數(shù)、需要存儲的最大記錄數(shù)目、每條記錄的大小和扇區(qū)映射表。8、如權(quán)利要求7所述的方法,其特征在于,所述扇區(qū)映射表包括扇區(qū)邏輯編號、扇區(qū)物理編號和4L瞼碼。9、如權(quán)利要求6所述的方法,其特征在于,所述動態(tài)存儲信息包括所述數(shù)據(jù)在所述嵌入式芯片中的當前寫入位置、當前讀取位置和當前存儲扇區(qū)使用的狀態(tài)信息。10、如權(quán)利要求l所述的方法,其特征在于,在所述嵌入式芯片的扇區(qū)發(fā)生損壞時,分配相應的空閑扇區(qū)代替損壞的扇區(qū),并將所述損壞的扇區(qū)和所述空閑扇區(qū)的信息分別記錄到所述數(shù)據(jù)跟蹤結(jié)構(gòu)中。11、一種在嵌入式系統(tǒng)中讀取數(shù)據(jù)的方法,其特征在于,包括步驟根據(jù)查詢數(shù)據(jù)的請求獲取待查詢數(shù)據(jù)的數(shù)據(jù)名稱;在記錄數(shù)據(jù)存儲位置的數(shù)據(jù)跟蹤結(jié)構(gòu)表中確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的存儲位置;在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù)。12、如權(quán)利要求11所述的方法,其特征在于,所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中包括數(shù)據(jù)的靜態(tài)屬性信息和動態(tài)存儲信息,其中,所述靜態(tài)屬性信息保存在所述嵌入式芯片中,所述動態(tài)存儲信息在嵌入式設備運行后保存在系統(tǒng)內(nèi)存中。13、如權(quán)利要求12所述的方法,其特征在于,所述靜態(tài)屬性信息包括數(shù)據(jù)名稱、需要的扇區(qū)總數(shù)、需要存儲的最大記錄數(shù)目、每條記錄的大小和扇區(qū)映射表。14、如權(quán)利要求13所述的方法,其特征在于,所述扇區(qū)映射表包括扇區(qū)邏輯編號、扇區(qū)物理編號和才L險碼。15、如權(quán)利要求12所述的方法,其特征在于,所述動態(tài)存儲信息包括所述數(shù)據(jù)在所述嵌入式芯片中的當前寫入位置、當前讀取位置和當前存儲扇區(qū)使用的狀態(tài)信息。16、一種數(shù)據(jù)管理裝置,其特征在于,包括用于根據(jù)有效記錄數(shù)和擦寫頻率分別確定所述數(shù)據(jù)需要占用的存儲空間大小,進一步根據(jù)所述存儲空間大小分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,并按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間的單元;用于將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置的單元;用于在記錄數(shù)據(jù)存儲位置的數(shù)據(jù)跟蹤結(jié)構(gòu)表中確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的存儲位置的單元;用于在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù)的單元。17、一種嵌入式系統(tǒng),其特征在于,包括嵌入式芯片,用于存儲數(shù)據(jù);數(shù)據(jù)管理模塊,用于向所述嵌入式芯片存儲數(shù)據(jù)或查詢數(shù)據(jù),根據(jù)數(shù)據(jù)的有效記錄數(shù)和擦寫頻率分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間,并將數(shù)據(jù)存儲到所述存儲空間后在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置,以及根據(jù)所述數(shù)據(jù)跟蹤結(jié)構(gòu)表中數(shù)據(jù)記錄的存儲位置讀取數(shù)據(jù)。18、如權(quán)利要求17所述的嵌入式系統(tǒng),其特征在于,所述數(shù)據(jù)管理模塊包括用于根據(jù)有效記錄數(shù)和擦寫頻率分別確定所述數(shù)據(jù)需要占用的存儲空間大小,進一步根據(jù)所述存儲空間大小分別確定嵌入式芯片需要提供的扇區(qū)數(shù)目,并按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間的單元;用于將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置的單元;用于在記錄數(shù)據(jù)存儲位置的數(shù)據(jù)跟蹤結(jié)構(gòu)表中確定所述數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的存儲位置的單元;用于在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù)的單元。全文摘要本發(fā)明公開了一種在嵌入式系統(tǒng)中存儲、讀取數(shù)據(jù)的方法,用以解決現(xiàn)有嵌入式系統(tǒng)中芯片存儲和查詢性能以及使用壽命較低的問題;在存儲數(shù)據(jù)時獲取待存儲的數(shù)據(jù)及其有效記錄數(shù)、擦寫頻率和每條記錄的大小,并根據(jù)所述有效記錄數(shù)和擦寫頻率分別確定嵌入式芯片為所述數(shù)據(jù)需要提供的扇區(qū)數(shù)目,并按其中最大的扇區(qū)數(shù)目在所述嵌入式芯片中分配存儲空間,以及將所述數(shù)據(jù)存儲到所述存儲空間并在數(shù)據(jù)跟蹤結(jié)構(gòu)表中記錄存儲位置;在讀取數(shù)據(jù)時,通過跟蹤數(shù)據(jù)記錄的數(shù)據(jù)跟蹤結(jié)構(gòu)表確定數(shù)據(jù)名稱對應的數(shù)據(jù)存儲在嵌入式芯片中的位置,并在所述嵌入式芯片中的所述存儲位置讀取數(shù)據(jù);采用本發(fā)明方法可以提高嵌入式芯片的存儲和查詢性能。文檔編號G06F12/02GK101241469SQ20071000042公開日2008年8月13日申請日期2007年2月5日優(yōu)先權(quán)日2007年2月5日發(fā)明者鳴馮,包培友,李習東,皓蔡申請人:力博特公司