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