基于嵌入式MCU數(shù)據(jù)Flash的數(shù)據(jù)存儲及管理方法研究與實現(xiàn)
具體應(yīng)用
本文引用地址:http://cafeforensic.com/article/170167.htm在筆者開發(fā)的電動汽車儀表盤中,需要存儲總里程、小計里程、電機(jī)故障等信息,按照前文所述的方法,首先建立數(shù)據(jù)分區(qū),為每個數(shù)據(jù)條目建立ID,該ID同時可表征數(shù)據(jù)狀態(tài)字:
ID=1,對應(yīng)電機(jī)故障,大小為1個字節(jié);
ID=2,對應(yīng)總里程,大小為4個字節(jié);
ID=3,對應(yīng)小計里程,大小為2個字節(jié);
各數(shù)據(jù)條目在分區(qū)內(nèi)的格式如下:
分區(qū)狀態(tài)字Status_word(1個字節(jié))+電機(jī)故障ID(1個字節(jié))+電機(jī)故障(1個字節(jié))+總里程ID(一個字節(jié))+總里程(4個字節(jié))+小計里程ID(1個字節(jié))+小計里程(2個字節(jié));
經(jīng)計算,實際存儲需求為11個字節(jié),為了計算的方便,設(shè)定分區(qū)大小為2的冪,選為16;MC9S12HY32內(nèi)置數(shù)據(jù)Flash的扇區(qū)大小為256個字節(jié),為了保證掉電不丟失數(shù)據(jù),必須占用至少兩個扇區(qū),根據(jù)公式(1),分區(qū)個數(shù)選定為32。數(shù)據(jù)Flash可擦寫次數(shù)為10萬次,在每次數(shù)據(jù)寫操作都會引起數(shù)據(jù)分區(qū)輪轉(zhuǎn)的最壞情況下,數(shù)據(jù)可擦寫次數(shù)為10萬*32=320萬次,大于EEPROM的可擦寫100萬次的使用壽命,可以滿足產(chǎn)品生命周期要求。
如前文所述,在進(jìn)行數(shù)據(jù)讀/寫操作時,首先通過數(shù)據(jù)條目ID進(jìn)行偏移地址查表,計算數(shù)據(jù)在分區(qū)內(nèi)的相對地址,其實現(xiàn)函數(shù)如下:
uint16_t GetDataAddrFromItsId(uint16_t data_id)
{
uint16_t addr;
if(EE_MOTOR_ERR == data_id){
addr = EEPROM_START + 1;
}else if(EE_MILES_TOTAL == data_id){
addr = EEPROM_START + 3;
}else if(EE_MILES_RELATIVE == data_id){
addr = EEPROM_START + 8;
}else{
addr = EEPROM_START; /* not valid data id,so give unvalid addr */
}
return addr;
}
EE_MOTOR_ERR、EE_MILES_TOTAL、EE_MILES_RELATIVE即表示數(shù)據(jù)條目ID的宏。
在行車過程中,當(dāng)小計里程改變時,不僅在液晶屏上實時更新小計里程數(shù)據(jù),同時需要把更新后的小計里程寫在數(shù)據(jù)Flash中,其具體函數(shù)如下:
void MilesRelativeStore(void)
{
if(Miles_relative != Miles_relative_stored){
(void)WriteEeprom(EE_MILES_RELATIVE,&Miles_relative,sizeof(Miles_relative));
Miles_relative_stored = Miles_relative;
}
}
由上述函數(shù)可見,應(yīng)用本專利所設(shè)計方法,可以屏蔽底層實現(xiàn)細(xì)節(jié),提供給應(yīng)用層簡單、清晰、和EEPROM一樣簡便的接口。
結(jié)語
本文從Flash特性出發(fā)研究并實現(xiàn)一種高效的數(shù)據(jù)存儲及管理方法,其實現(xiàn)層面實現(xiàn)與EEPROM同樣的應(yīng)用接口,具有很高的使用價值,同時有效利用了MCU的內(nèi)部資源,提高了MCU Data Flash的使用壽命,使之可以滿足產(chǎn)品生命周期要求,并節(jié)約了產(chǎn)品的BOM成本,所設(shè)計方法在筆者設(shè)計的汽車儀表盤中得到實際應(yīng)用和長時間驗證,運行效果良好,具有很好的實用價值。
參考文獻(xiàn):
[1] 劉會忠,景瑞霞.損耗均衡算法在Flash管理中的應(yīng)用研究[J].河北省科學(xué)院學(xué)報,2009,(2):4-6
[2] 山東省科學(xué)院自動化研究所.一種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法:中國,201210074452.5[P].2012-09-12
[3] 易軍,曹龍漢,周熙.FLASH存儲管理子系統(tǒng)的設(shè)計與實現(xiàn)[J].微計算機(jī)信息,2008,(8):86-87
[4] 葉樹梅,季愛明,俞一彪.嵌入式系統(tǒng)中Flash存儲管理策略[J].科學(xué)技術(shù)與工程,2011,(17):77-79
[5] 梁海浪,蔡李隆.dsPIC30F6014內(nèi)部EEPROM讀寫C程序設(shè)計及其應(yīng)用[J] .電子產(chǎn)品世界,2005,(11):96-98
[6] 杜偉慶,蘇凱雄.嵌入式系統(tǒng)中NOR Flash 的分塊管理與實現(xiàn)[J] .計算機(jī)與數(shù)字工程,2009,(12):80-82
[7] 王標(biāo),周新志,羅志平.嵌入式系統(tǒng)中Nand Flash寫平衡的研究[J].微計算機(jī)信息,2008,(14):8-10
[8] 陸林燕,王魯靜,鄭正奇.NAND FLASH編程實現(xiàn)研究分析[J].計算機(jī)技術(shù)與發(fā)展,2008,(3):118-120
評論