NOR也是有寿命的,毕竟不是无限,哪一天丢数据就爽了,我写了个简单的算法,可以做冗余,代价只有几个Block而已,RAM开销84字节+Buffer,典型设计10Byte的Buffer都非常够用.
先看一眼.
比如我这个是16MBte的Flash,也就是16777216字节,可用16773120字节,开销了4K就够了.非常节省.支持多次配置,多声明几个结构体就行.移植简单,硬件无关,只要做CRC计算的,Flash擦读写的,还有Malloc就可以了.
而且,操作跟一般Flash操作无区别,完全透明一层.初始化传入极少的参数就可以.(7个参数.)
磨损平衡几乎没额外时间开销(通过多次验证,均在数us时间内完成转换,测试芯片是STM32L476VG~).
实测占用136KB即可管理N25Q128(16MByte),并且占用的只是NOR的空间.并且带冗余和各种了.
磨损平衡,单文件实现~
如果需要学习,注释明白清楚~
静下心来细细的品,希望能得到指点。技术您。
@Y.K 可以的,会继续优化下.
好久以前下了您的代码,今天再来看看,发现研究的东西很多。决定好好学学,希望以后不吝赐教!
仔细看了代码,对于你的磨损平衡机制似懂非懂,另外你在介绍中说可以用在fatfs上,觉得非常难以实现
@岗岗 FATFS直接使用他的读写函数代替以前的BLOCK读写函数就可以完成,基本是透明的实现.
你好,我想问一下这个用的话是否每次上电都需要调用这个WL_Flash_Config(&MWL_Flash);?另外就是出现坏块后是否自动跳过坏块去写
你好,仔细看了一下代码,对均匀磨损的机理还没有弄懂,能不能麻烦楼主将实现原理解释一下。我是菜鸟,见谅!
@lx 中心思想就是主要减少擦除次数,写满一次再到下一页,参考ST官方的片内FLASH模拟EEPROM,简单很多.
有使用这个算法的人可以说下能不能实现吗,我移植完之后发现好像没法实现
@L 一直写入读取都在同一个地址,没有体现出磨损均衡的思想,可能是我没有理解透题主的思想
@L 逻辑层是一个地址,底层是轮换.
@TaterLi 嗯嗯,谢谢你的回复,但是我直接看的是BSP_QSPI_WRITE这个函数的地址,这个函数封装的是底层的SPI写入函数,发现一直是同一个地址,然后我试着对逻辑层的地址(WL_Flash_Write)进行写入和读取,发现还是再同一个地址上操作的
@TaterLi 每次擦除更新WL表变化的是POS的值,但是这个值对修改底层磨损地址好像没有太大关系,有关系的是move_count,但是这个值的变化只出现在POS>POS_MAX的时候,主要是这个地方很纠结,这是怎么实现的磨损平衡呢,希望不吝赐教!
@L 写入时每次转换的物理地址都相同,没明白
没有看明白算法,可以留个联系方式,私下请教一下嘛?谢谢。
这个库应该是只支持一个buf在flash上的写入,比如你有两个东西要写,就需要config两块区域,不知道理解是否正确
@ming 目前这个库已并入esp-idf主线(v4.4之后),如果重擦除所有信息,是会计算出同一个物理地址的,目前esp-idf主线上的磨损平衡代码更可靠.具体看components/wear_levelling.
您好,我仔细看了components/wear_levelling部分,现在有很多与ESP相关的,我能移植到其它目标平台吗?比如STM32