基于嵌入式MCU數據Flash的數據存儲及管理方法研究與實現
具體實施
本文引用地址:http://www.104case.com/article/170167.htm數據分區設計
首先根據嵌入式系統的應用需求和MCU內部數據Flash的扇區大小,合理設置數據分區大小和個數,將數據Flash的若干扇區劃分為多個數據分區,其取值均為2的n次冪,分區以0,1,2…進行編號,個數不大于256。分區大小和個數的設置和數據Flash的扇區長度匹配起來,滿足以下公式:
分區大小*分區個數=扇區大小*扇區個數 (1)
在每個數據分區的起始地址設置分區狀態字,反映數據分區的存儲歷史時間,在分區擦除后的第一次寫操作完成后更新。設置數據條目的格式為data id+data,data id取值區間為[0,254],為每個數據條目的data id和data分配偏移地址,建立數據序列,組織數據分區,數據分區的格式為:分區狀態字+ data id 1 + data 1 + data id 2 + data 2…。數據分區這樣的存儲結構非常適合需要進行多個獨立數據存儲的嵌入式系統應用,通過數據分區的格式定義,對其某個數據的尋址非常簡單。
數據讀取操作
數據讀取操作在最新數據分區上進行,首先通過數據條目的data id進行偏移地址查表,然后根據最新數據分區編號進行地址計算,計算公式如下:
地址=0號分區首地址+(最新數據分區編號*分區大小)+偏移地址 (2)
和EEPROM的讀取方式一樣,直接讀取該地址便可以得到數據[5],讀取操作不會改變最新數據分區及其狀態字。其軟件實現如下所示:
void ReadEeprom(uint16_t data_id, void *dest_addr,uint16_t size)
{
u_EepromWord eedata;
uint16_t src_addr;
src_addr = GetDataAddrFromItsId(data_id);
src_addr += (Active_bank * EEPROM_SIZE_BYTES);
while(0 != size){
eedata.word = READFLASH16(src_addr);
*(uint8_t*)dest_addr = eedata.byte.msb;
((uint8_t*)dest_addr)++;
src_addr++;
size--;
}
}
數據寫操作
在數據條目的設計中,將數據條目的data id存儲地址同時做為數據狀態字的存儲地址,在寫操作時通過數據狀態字判斷該數據條目地址是否執行過擦除操作,從而避免不必要的分區拷貝和扇區擦除操作,降低數據寫操作代價[6]。首先根據公式(2)計算數據在最新數據分區的存儲地址,讀取其data id存儲位置得到數據狀態字,判斷該數據在最新數據分區的寫入地址是否已經被擦除。如果數據狀態字等于0xff,表明寫入地址已經被擦除,按照Flash的寫操作命令序列在data id地址處寫入data id,在data地址處寫入data;如果數據狀態字不等于0xff,表明寫入地址未被擦除,需要進行分區拷貝操作,操作完成后更新最新分區及最新分區狀態字。數據寫操作流程如圖2所示。

評論