新聞中心

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

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

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

          通過為每個數(shù)據(jù)建立狀態(tài)字來表示是否已經(jīng)在當(dāng)前分區(qū)上進(jìn)行了存儲操作,數(shù)據(jù)1的存儲操作便不會影響數(shù)據(jù)2的存儲,數(shù)據(jù)2仍然能夠在當(dāng)前分區(qū)上進(jìn)行存儲,而不會每次只要有數(shù)據(jù)的寫操作都會造成所有的數(shù)據(jù)在分區(qū)之間的搬移,這樣不僅提高了寫操作的效率,而且會進(jìn)一步提高的使用壽命[7]

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

          分區(qū)拷貝操作

          在進(jìn)行數(shù)據(jù)在分區(qū)間的拷貝操作時,首先備份當(dāng)前最新分區(qū)狀態(tài)字和最新數(shù)據(jù)分區(qū)編號,然后更新最新數(shù)據(jù)分區(qū)編號,查看最新數(shù)據(jù)分區(qū)首地址是否是扇區(qū)首地址,如果是,執(zhí)行扇區(qū)擦除操作[8],然后按照的寫操作命令序列在當(dāng)前最新數(shù)據(jù)分區(qū)的data id地址處寫入data id,在data地址處寫入data,然后將備份數(shù)據(jù)分區(qū)內(nèi)的其他數(shù)據(jù)復(fù)制到當(dāng)前最新數(shù)據(jù)分區(qū)中。

          最新數(shù)據(jù)分區(qū)及狀態(tài)字更新

          最新數(shù)據(jù)分區(qū)編號的更新算法為:將最新數(shù)據(jù)分區(qū)編號加一,判斷其結(jié)果,如果最新數(shù)據(jù)分區(qū)編號等于分區(qū)個數(shù),設(shè)置最新數(shù)據(jù)分區(qū)編號為0。狀態(tài)字更新算法為:判斷所備份最新數(shù)據(jù)分區(qū)狀態(tài)字是否等于0xfe,如果等于0xfe,設(shè)置最新分區(qū)狀態(tài)字為0,否則最新分區(qū)狀態(tài)字加一,然后將最新分區(qū)狀態(tài)字寫入當(dāng)前最新數(shù)據(jù)分區(qū)狀態(tài)字地址,即數(shù)據(jù)分區(qū)首地址位置。

          掉電存儲

          如果系統(tǒng)在寫操作期間掉電,由于在發(fā)生掉電時最新數(shù)據(jù)分區(qū)狀態(tài)字還沒有更新,再次上電時查找到的最新數(shù)據(jù)分區(qū)仍然是寫操作進(jìn)行前的那個數(shù)據(jù)分區(qū),通過在寫入操作完成后更新狀態(tài)字的方式保證了即使發(fā)生了掉電,重新上電后數(shù)據(jù)仍能恢復(fù)為原來的數(shù)據(jù)分區(qū)中的數(shù)據(jù)。上電時通過分區(qū)狀態(tài)字查找最新數(shù)據(jù)分區(qū)的算法如下:

          (1)當(dāng)存在取值為0的分區(qū)狀態(tài)字時,小于分區(qū)數(shù)的最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū);
          (2)當(dāng)不存在取值為0的分區(qū)狀態(tài)字時,最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū);該算法實現(xiàn)流程如附圖3所示,上電后經(jīng)過該算法處理后,可以得到最新數(shù)據(jù)分區(qū)編號和最新數(shù)據(jù)分區(qū)狀態(tài)字,其軟件代碼如下所示:

          static void FindNewestBankByStatusWord(void)
          {
          Bool roll_over;
          uint8_t bank;
          uint16_t bank_status;
          uint16_t largest_status = 0;
          Bool erased = TRUE;
          roll_over = StatusWordIsRollover();
          for(bank = 0;bank < _BANKS;bank++){
          bank_status = READFLASH16(_START + (bank * _SIZE_BYTES));
          if(FLASH_ERASED_WORD != bank_status){
          erased = FALSE;
          if(TRUE == roll_over){
          if((bank_status < EEPROM_BANKS) && (bank_status >= largest_status)){
          Active_bank = bank;
          largest_status = bank_status;
          }
          }else{
          if(bank_status > largest_status){ Active_bank = bank;
          largest_status = bank_status;
          }
          }
          if(TRUE == erased){ Active_bank = 0;
          (void)EraseEepromBank(EEPROM_START);
          }
          }

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


        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 长海县| 武宁县| 台安县| 公安县| 辉县市| 柳河县| 固始县| 正阳县| 且末县| 汉源县| 辰溪县| 晋宁县| 麦盖提县| 杭州市| 句容市| 冀州市| 军事| 万全县| 林芝县| 温州市| 延吉市| 临泽县| 沅陵县| 宁夏| 临城县| 理塘县| 奉化市| 博白县| 酒泉市| 北安市| 双峰县| 边坝县| 漾濞| 平顺县| 宁城县| 江都市| 闸北区| 海城市| 行唐县| 陕西省| 勐海县|