本篇内容介绍了“flash模拟eeprom存储日志的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
文章目的
采用flash模拟eeprom的优点
方案设计
注意事项
做mcu开发时,涉及到数据存储时,往往都会考虑使用flash、eeprom,或者铁电存储器。从数据储存的角度上来说,安全性最高的肯定是FRAM,接着才会考虑使用EEPROM,对于一般的数据储存,flash就足够了。考虑到一般的MCU都不会携带EEPROM,最简单的方案可以利用flash模拟出eeprom,并且实现基本的日志文件系统操作,下面来描述一下基本的原理。
一般做mcu开发时,都会存储数据,如果有文件系统,可以写到文件中,但是一般不用文件系统时,则直接操作flash的读写。根据flash的操作特点,一方面是flash是只能从1变为0,不能从0写到1。只有当擦除一个页的时候,才能将该页上的数据从0变为1。以一个页为4K大小来计算,如果每次存几十个字节,并且多次重复操作,那么每次都需要擦除一个页之后再写数据。
假如用户数据是一连串的状态信息,每次都只会改变其中的一个状态,或者一个字节,那么每次操作都会将flash上所有的用户数据读到内存中,然后将内存中的数据的变化的状态位改变,然后再擦除page,接着再将内存中的数据写到flash的page上。
由于flash的读写寿命有限,在10w次左右,并且擦除page消耗的时间很长。所以上述方案存在缺陷,那么如何才能让flash像eeprom一样读写,而且操作也不用每次擦除flash呢?
为了非常容易的将flash当作eeprom来使用,需要确保两个条件
1.读写的数据量至少小于1/2的flash的一个page数据量的大小
2.准备至少两个pages
然后就可以开始设计数据的搬运了。
每个page的数据结构可以按照上图所示进行设计。
首先每个pages的头部都会有一个标志,用于描述当前的pages的状态,其状态有未初始化、有效、无效。具体场景是,当未初始化时,由于flash的电气特性,其flags为0xff,此时需要初始化该page,往其标志位写有效即可。然后依次向下存放数据,此时由于知道每次写的数据量的大小,只需要确定其偏移量即可。
而这样也会带来一个问题,就是如何确保每次断电后再上电也能知道当前写数据的偏移?
要想解决这个问题,可以在每次上电的时候,遍历该page0,通过读取特定的用户数据的标志位来确保得到当前数据的偏移量,然后就可以记录在内存中,接着执行了。
当数据在一个page0中存满后,此时需要将数据转移到page1了。这个过程比较可以好好分解一下:
因为是日志型的数据类型,一定会存在数据被删除或者更新的情况,所以page0中会有两个同为index=0
的用户数据。而且是最新的在后面。
一旦程序在pages上进行数据的写操作时,检查到剩余的pages空间不足则会将page0的状态设置成无效,接着开始将page1的flags设置为有效状态,同时开始将pages0中的数据转移到page1,注意在转移的时候,需要检查page0中的index
,用最新的数据取代旧的数据。最后擦除page0即可。
依次按照上面的顺序进行数据的搬运即可实现日志型数据操作的存储。
该方案的使用,在很多情况下都可以很好的操作,但是一旦用户数据量很大,接近1/2的page数据量时,频繁的擦写flash的问题也会存在。
随着page个数的增加,也可以减少擦除的次数,带来的问题是程序设计的更加复杂。
实际使用的过程中每个pages的flag标志不一定只有有效和无效的状态,比如在转移过程中,突然断电了,为了保证数据的不丢失,一定要考虑到每个page异常情况下的状态,并能够恢复数据。达到掉电安全状态。
有了这些后台管理机制,再写日志时,上层便可以直接使用读写函数进行操作,而不用管底层到底是flash还是eeprom。
“flash模拟eeprom存储日志的原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。