<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

            具體實(shí)施

          本文引用地址:http://www.ex-cimer.com/article/170167.htm

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

            首先根據(jù)系統(tǒng)的應(yīng)用需求和內(nèi)部數(shù)據(jù)的扇區(qū)大小,合理設(shè)置數(shù)據(jù)分區(qū)大小和個數(shù),將數(shù)據(jù)的若干扇區(qū)劃分為多個數(shù)據(jù)分區(qū),其取值均為2的n次冪,分區(qū)以0,1,2…進(jìn)行編號,個數(shù)不大于256。分區(qū)大小和個數(shù)的設(shè)置和數(shù)據(jù)的扇區(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ú)立系統(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)

            和的讀取方式一樣,直接讀取該地址便可以得到數(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 * _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所示。

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


          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();