新聞中心

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è)計了一種利用內(nèi)部數(shù)據(jù)存儲非易失性數(shù)據(jù)的方法,它將數(shù)據(jù)的若干扇區(qū)劃分為多個數(shù)據(jù)分區(qū),不同數(shù)據(jù)分區(qū)存儲數(shù)據(jù)在不同歷史時間的拷貝,最新數(shù)據(jù)分區(qū)存儲最新的數(shù)據(jù)拷貝;在數(shù)據(jù)讀操作進行時,計算最新數(shù)據(jù)拷貝的存儲位置,直接讀取該地址;在數(shù)據(jù)寫操作進行時,判斷數(shù)據(jù)寫入位置是否已經(jīng)被擦除,如果寫入位置未擦除,將數(shù)據(jù)寫入下一個分區(qū),同時將當(dāng)前分區(qū)中的其他數(shù)據(jù)復(fù)制到下一個分區(qū);如果寫入位置已經(jīng)擦除,直接將數(shù)據(jù)寫入當(dāng)前分區(qū)中。該方法實現(xiàn)了類似的數(shù)據(jù)讀寫方式,操作方便,應(yīng)用接口簡單,而且可以盡量避免扇區(qū)擦除操作,提高存儲效率,同時提高內(nèi)部數(shù)據(jù)Flash的使用壽命。

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

  引言

  在系統(tǒng)設(shè)計中,經(jīng)常需要存儲一些非易失性的數(shù)據(jù),在筆者開發(fā)的電動汽車儀表盤中,需要存儲總里程、小計里程、電機故障等其他信息,采用支持對字節(jié)讀寫的實現(xiàn),操作起來和RAM一樣簡單方便,但同時會在大批量產(chǎn)品的生產(chǎn)中帶來成本問題和維護問題。在有數(shù)據(jù)Flash的中,采用數(shù)據(jù)Flash代替實現(xiàn)非易失性的存儲,便可以節(jié)約成本且無需維護,筆者所設(shè)計的儀表盤采用內(nèi)置4KB數(shù)據(jù)閃存的MC9S12HY32做為處理器,足以滿足儀表盤要求。用Flash存儲數(shù)據(jù)的傳統(tǒng)方式是為每個數(shù)據(jù)分配固定的存儲地址,由于Flash在進行寫操作時需要先擦除數(shù)據(jù)所在的整個扇區(qū)[1],對一個數(shù)據(jù)進行寫操作便會造成對扇區(qū)內(nèi)其他數(shù)據(jù)的擦除,由于擦除操作耗時較長,不僅效率低,影響系統(tǒng)的實時性,而且為了避免丟失其他數(shù)據(jù)需要相當(dāng)復(fù)雜的處理,對MCU的RAM空間也有一定的要求。如果寫入數(shù)據(jù)失敗,會造成所寫入數(shù)據(jù)的丟失,如果在擦除扇區(qū)后發(fā)生掉電,便會造成扇區(qū)內(nèi)所有數(shù)據(jù)的丟失。不僅如此,由于每次寫入操作都需要先擦除扇區(qū),以擦除次數(shù)表征的Flash使用壽命也無法滿足產(chǎn)品生命周期的要求。本文提供一種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法[2],它不僅操作方便,應(yīng)用接口簡單,而且可以盡量避免扇區(qū)擦除操作,提高存儲效率,同時提高MCU內(nèi)部數(shù)據(jù)Flash的使用壽命。

  總體設(shè)計

  通過在MCU數(shù)據(jù)Flash上建立多個數(shù)據(jù)分區(qū),存儲數(shù)據(jù)的多個拷貝,避免對Flash固定地址的反復(fù)擦除,提高Flash的使用壽命,同時通過數(shù)據(jù)讀寫方法的設(shè)計和數(shù)據(jù)分區(qū)的管理,避免對Flash扇區(qū)的不必要擦除,并最終實現(xiàn)和EEPROM讀寫很類似的應(yīng)用接口。具體地,首先根據(jù)系統(tǒng)的應(yīng)用需求和MCU內(nèi)部數(shù)據(jù)Flash的扇區(qū)大小,合理設(shè)置數(shù)據(jù)分區(qū)大小和個數(shù),將數(shù)據(jù)Flash的若干扇區(qū)劃分為多個數(shù)據(jù)分區(qū)。在每個數(shù)據(jù)分區(qū)的起始地址設(shè)置分區(qū)狀態(tài)字[3],反映數(shù)據(jù)分區(qū)的存儲歷史時間,不同數(shù)據(jù)分區(qū)存儲數(shù)據(jù)在不同歷史時間的拷貝,當(dāng)前數(shù)據(jù)分區(qū)存儲最新的數(shù)據(jù)拷貝;同時為每個數(shù)據(jù)條目建立數(shù)據(jù)狀態(tài)字,反映該數(shù)據(jù)在所在分區(qū)內(nèi)存儲地址是否已經(jīng)被擦除。

  系統(tǒng)上電后,首先根據(jù)數(shù)據(jù)分區(qū)狀態(tài)字查找存儲最新數(shù)據(jù)的分區(qū),將之設(shè)置為最新數(shù)據(jù)分區(qū),并設(shè)置其分區(qū)狀態(tài)字為最新分區(qū)狀態(tài)字。在數(shù)據(jù)讀操作進行時,根據(jù)最新數(shù)據(jù)分區(qū)及數(shù)據(jù)在分區(qū)內(nèi)的偏移地址計算最新數(shù)據(jù)拷貝的Flash存儲位置,直接讀取該地址。在數(shù)據(jù)寫操作進行時,首先計算該數(shù)據(jù)的Flash存儲地址,然后根據(jù)數(shù)據(jù)狀態(tài)字判斷數(shù)據(jù)所在的Flash存儲地址是否已經(jīng)被擦除[4],如果寫入位置已經(jīng)擦除,直接將數(shù)據(jù)寫入當(dāng)前分區(qū)中,其他數(shù)據(jù)保持不變;如果寫入位置未擦除,進行分區(qū)拷貝操作,即將數(shù)據(jù)寫入下一個分區(qū),將當(dāng)前分區(qū)中的其他數(shù)據(jù)依次復(fù)制到下一個分區(qū),同時將下一個分區(qū)設(shè)置為最新數(shù)據(jù)分區(qū),更新最新分區(qū)狀態(tài)字并存儲在最新數(shù)據(jù)分區(qū)首地址位置。其設(shè)計流程如圖1所示。

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

上一頁 1 2 3 4 下一頁

評論


相關(guān)推薦

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

關(guān)閉