基于嵌入式MCU數(shù)據(jù)Flash的數(shù)據(jù)存儲及管理方法研究與實(shí)現(xiàn)
具體實(shí)施
本文引用地址:http://www.ex-cimer.com/article/170167.htm數(shù)據(jù)分區(qū)設(shè)計(jì)
首先根據(jù)嵌入式系統(tǒng)的應(yīng)用需求和MCU內(nèi)部數(shù)據(jù)Flash的扇區(qū)大小,合理設(shè)置數(shù)據(jù)分區(qū)大小和個數(shù),將數(shù)據(jù)Flash的若干扇區(qū)劃分為多個數(shù)據(jù)分區(qū),其取值均為2的n次冪,分區(qū)以0,1,2…進(jìn)行編號,個數(shù)不大于256。分區(qū)大小和個數(shù)的設(shè)置和數(shù)據(jù)Flash的扇區(qū)長度匹配起來,滿足以下公式:
分區(qū)大小*分區(qū)個數(shù)=扇區(qū)大小*扇區(qū)個數(shù) (1)
在每個數(shù)據(jù)分區(qū)的起始地址設(shè)置分區(qū)狀態(tài)字,反映數(shù)據(jù)分區(qū)的存儲歷史時間,在分區(qū)擦除后的第一次寫操作完成后更新。設(shè)置數(shù)據(jù)條目的格式為data id+data,data id取值區(qū)間為[0,254],為每個數(shù)據(jù)條目的data id和data分配偏移地址,建立數(shù)據(jù)序列,組織數(shù)據(jù)分區(qū),數(shù)據(jù)分區(qū)的格式為:分區(qū)狀態(tài)字+ data id 1 + data 1 + data id 2 + data 2…。數(shù)據(jù)分區(qū)這樣的存儲結(jié)構(gòu)非常適合需要進(jìn)行多個獨(dú)立數(shù)據(jù)存儲的嵌入式系統(tǒng)應(yīng)用,通過數(shù)據(jù)分區(qū)的格式定義,對其某個數(shù)據(jù)的尋址非常簡單。
數(shù)據(jù)讀取操作
數(shù)據(jù)讀取操作在最新數(shù)據(jù)分區(qū)上進(jìn)行,首先通過數(shù)據(jù)條目的data id進(jìn)行偏移地址查表,然后根據(jù)最新數(shù)據(jù)分區(qū)編號進(jìn)行地址計(jì)算,計(jì)算公式如下:
地址=0號分區(qū)首地址+(最新數(shù)據(jù)分區(qū)編號*分區(qū)大小)+偏移地址 (2)
和EEPROM的讀取方式一樣,直接讀取該地址便可以得到數(shù)據(jù)[5],讀取操作不會改變最新數(shù)據(jù)分區(qū)及其狀態(tài)字。其軟件實(shí)現(xiàn)如下所示:
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--;
}
}
數(shù)據(jù)寫操作
在數(shù)據(jù)條目的設(shè)計(jì)中,將數(shù)據(jù)條目的data id存儲地址同時做為數(shù)據(jù)狀態(tài)字的存儲地址,在寫操作時通過數(shù)據(jù)狀態(tài)字判斷該數(shù)據(jù)條目地址是否執(zhí)行過擦除操作,從而避免不必要的分區(qū)拷貝和扇區(qū)擦除操作,降低數(shù)據(jù)寫操作代價[6]。首先根據(jù)公式(2)計(jì)算數(shù)據(jù)在最新數(shù)據(jù)分區(qū)的存儲地址,讀取其data id存儲位置得到數(shù)據(jù)狀態(tài)字,判斷該數(shù)據(jù)在最新數(shù)據(jù)分區(qū)的寫入地址是否已經(jīng)被擦除。如果數(shù)據(jù)狀態(tài)字等于0xff,表明寫入地址已經(jīng)被擦除,按照Flash的寫操作命令序列在data id地址處寫入data id,在data地址處寫入data;如果數(shù)據(jù)狀態(tài)字不等于0xff,表明寫入地址未被擦除,需要進(jìn)行分區(qū)拷貝操作,操作完成后更新最新分區(qū)及最新分區(qū)狀態(tài)字。數(shù)據(jù)寫操作流程如圖2所示。
評論