新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于嵌入式MCU數據Flash的數據存儲及管理方法研究與實現

        基于嵌入式MCU數據Flash的數據存儲及管理方法研究與實現

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

          具體實施

        本文引用地址:http://www.104case.com/article/170167.htm

          數據分區設計

          首先根據系統的應用需求和內部數據的扇區大小,合理設置數據分區大小和個數,將數據的若干扇區劃分為多個數據分區,其取值均為2的n次冪,分區以0,1,2…進行編號,個數不大于256。分區大小和個數的設置和數據的扇區長度匹配起來,滿足以下公式:

          分區大小*分區個數=扇區大小*扇區個數 (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)

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

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


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 扎囊县| 丹凤县| 江北区| 黄冈市| 杭州市| 翼城县| 繁峙县| 东阿县| 凯里市| 开阳县| 双流县| 金堂县| 甘孜县| 平远县| 南昌县| 安仁县| 西城区| 海南省| 鹤岗市| 榆林市| 黑河市| 南雄市| 吴桥县| 金门县| 蓬溪县| 岐山县| 芷江| 宕昌县| 临颍县| 阿克陶县| 宁国市| 遂宁市| 甘泉县| 桃园县| 电白县| 营山县| 尉氏县| 乌海市| 鲁甸县| 灵宝市| 通辽市|