基于嵌入式MCU數據Flash的數據存儲及管理方法研究與實(shí)現
通過(guò)為每個(gè)數據建立狀態(tài)字來(lái)表示是否已經(jīng)在當前分區上進(jìn)行了存儲操作,數據1的存儲操作便不會(huì )影響數據2的存儲,數據2仍然能夠在當前分區上進(jìn)行存儲,而不會(huì )每次只要有數據的寫(xiě)操作都會(huì )造成所有的數據在分區之間的搬移,這樣不僅提高了寫(xiě)操作的效率,而且會(huì )進(jìn)一步提高Flash的使用壽命[7]。
本文引用地址:http://dyxdggzs.com/article/170167.htm分區拷貝操作
在進(jìn)行數據在分區間的拷貝操作時(shí),首先備份當前最新分區狀態(tài)字和最新數據分區編號,然后更新最新數據分區編號,查看最新數據分區首地址是否是Flash扇區首地址,如果是,執行扇區擦除操作[8],然后按照Flash的寫(xiě)操作命令序列在當前最新數據分區的data id地址處寫(xiě)入data id,在data地址處寫(xiě)入data,然后將備份數據分區內的其他數據復制到當前最新數據分區中。
最新數據分區及狀態(tài)字更新
最新數據分區編號的更新算法為:將最新數據分區編號加一,判斷其結果,如果最新數據分區編號等于分區個(gè)數,設置最新數據分區編號為0。狀態(tài)字更新算法為:判斷所備份最新數據分區狀態(tài)字是否等于0xfe,如果等于0xfe,設置最新分區狀態(tài)字為0,否則最新分區狀態(tài)字加一,然后將最新分區狀態(tài)字寫(xiě)入當前最新數據分區狀態(tài)字地址,即數據分區首地址位置。
掉電存儲
如果嵌入式系統在寫(xiě)操作期間掉電,由于在發(fā)生掉電時(shí)最新數據分區狀態(tài)字還沒(méi)有更新,再次上電時(shí)查找到的最新數據分區仍然是寫(xiě)操作進(jìn)行前的那個(gè)數據分區,通過(guò)在寫(xiě)入操作完成后更新?tīng)顟B(tài)字的方式保證了即使發(fā)生了掉電,重新上電后數據仍能恢復為原來(lái)的數據分區中的數據。上電時(shí)通過(guò)分區狀態(tài)字查找最新數據分區的算法如下:
(1)當存在取值為0的分區狀態(tài)字時(shí),小于分區數的最大狀態(tài)字代表的分區為最新數據分區;
(2)當不存在取值為0的分區狀態(tài)字時(shí),最大狀態(tài)字代表的分區為最新數據分區;該算法實(shí)現流程如附圖3所示,上電后經(jīng)過(guò)該算法處理后,可以得到最新數據分區編號和最新數據分區狀態(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 < EEPROM_BANKS;bank++){
bank_status = READFLASH16(EEPROM_START + (bank * EEPROM_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);
}
}
評論