新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于嵌入式MCU數(shù)據(jù)Flash的數(shù)據(jù)存儲(chǔ)及管理方法研究與實(shí)現(xiàn)

基于嵌入式MCU數(shù)據(jù)Flash的數(shù)據(jù)存儲(chǔ)及管理方法研究與實(shí)現(xiàn)

——
作者:劉源楊 馬建輝 莊汝科 王崗 時(shí)間:2013-09-23 來(lái)源:電子產(chǎn)品世界 收藏

  具體實(shí)施

本文引用地址:http://butianyuan.cn/article/170167.htm

  數(shù)據(jù)分區(qū)設(shè)計(jì)

  首先根據(jù)系統(tǒng)的應(yīng)用需求和內(nèi)部數(shù)據(jù)的扇區(qū)大小,合理設(shè)置數(shù)據(jù)分區(qū)大小和個(gè)數(shù),將數(shù)據(jù)的若干扇區(qū)劃分為多個(gè)數(shù)據(jù)分區(qū),其取值均為2的n次冪,分區(qū)以0,1,2…進(jìn)行編號(hào),個(gè)數(shù)不大于256。分區(qū)大小和個(gè)數(shù)的設(shè)置和數(shù)據(jù)的扇區(qū)長(zhǎng)度匹配起來(lái),滿足以下公式:

  分區(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ú)立系統(tǒng)應(yīng)用,通過(guò)數(shù)據(jù)分區(qū)的格式定義,對(duì)其某個(gè)數(shù)據(jù)的尋址非常簡(jiǎn)單。

  數(shù)據(jù)讀取操作

  數(shù)據(jù)讀取操作在最新數(shù)據(jù)分區(qū)上進(jìn)行,首先通過(guò)數(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)

  和的讀取方式一樣,直接讀取該地址便可以得到數(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 * _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í)通過(guò)數(shù)據(jù)狀態(tài)字判斷該數(shù)據(jù)條目地址是否執(zhí)行過(guò)擦除操作,從而避免不必要的分區(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所示。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉