基于嵌入式MCU数据Flash的数据存储及管理方法研究与实现
通过为每个数据建立状态字来表示是否已经在当前分区上进行了存储操作,数据1的存储操作便不会影响数据2的存储,数据2仍然能够在当前分区上进行存储,而不会每次只要有数据的写操作都会造成所有的数据在分区之间的搬移,这样不仅提高了写操作的效率,而且会进一步提高Flash的使用寿命[7]。
本文引用地址:https://www.eepw.com.cn/article/170167.htm分区拷贝操作
在进行数据在分区间的拷贝操作时,首先备份当前最新分区状态字和最新数据分区编号,然后更新最新数据分区编号,查看最新数据分区首地址是否是Flash扇区首地址,如果是,执行扇区擦除操作[8],然后按照Flash的写操作命令序列在当前最新数据分区的data id地址处写入data id,在data地址处写入data,然后将备份数据分区内的其他数据复制到当前最新数据分区中。
最新数据分区及状态字更新
最新数据分区编号的更新算法为:将最新数据分区编号加一,判断其结果,如果最新数据分区编号等于分区个数,设置最新数据分区编号为0。状态字更新算法为:判断所备份最新数据分区状态字是否等于0xfe,如果等于0xfe,设置最新分区状态字为0,否则最新分区状态字加一,然后将最新分区状态字写入当前最新数据分区状态字地址,即数据分区首地址位置。
掉电存储
如果嵌入式系统在写操作期间掉电,由于在发生掉电时最新数据分区状态字还没有更新,再次上电时查找到的最新数据分区仍然是写操作进行前的那个数据分区,通过在写入操作完成后更新状态字的方式保证了即使发生了掉电,重新上电后数据仍能恢复为原来的数据分区中的数据。上电时通过分区状态字查找最新数据分区的算法如下:
(1)当存在取值为0的分区状态字时,小于分区数的最大状态字代表的分区为最新数据分区;
(2)当不存在取值为0的分区状态字时,最大状态字代表的分区为最新数据分区;该算法实现流程如附图3所示,上电后经过该算法处理后,可以得到最新数据分区编号和最新数据分区状态字,其软件代码如下所示:

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);
}
}
评论