基于NOR Flash的磨损平衡算法

/ 17评 / 2

NOR也是有寿命的,毕竟不是无限,哪一天丢数据就爽了,我写了个简单的算法,可以做冗余,代价只有几个Block而已,RAM开销84字节+Buffer,典型设计10Byte的Buffer都非常够用.
先看一眼.

比如我这个是16MBte的Flash,也就是16777216字节,可用16773120字节,开销了4K就够了.非常节省.支持多次配置,多声明几个结构体就行.移植简单,硬件无关,只要做CRC计算的,Flash擦读写的,还有Malloc就可以了.
而且,操作跟一般Flash操作无区别,完全透明一层.初始化传入极少的参数就可以.(7个参数.)

磨损平衡几乎没额外时间开销(通过多次验证,均在数us时间内完成转换,测试芯片是STM32L476VG~).
实测占用136KB即可管理N25Q128(16MByte),并且占用的只是NOR的空间.并且带冗余和各种了.
磨损平衡,单文件实现~

如果需要学习,注释明白清楚~

然后下载地址是~ https://github.com/nickfox-taterli/nor_flash_wl

  1. Y.K说道:

    静下心来细细的品,希望能得到指点。技术您。

  2. Y.K说道:

    好久以前下了您的代码,今天再来看看,发现研究的东西很多。决定好好学学,希望以后不吝赐教!

  3. 岗岗说道:

    仔细看了代码,对于你的磨损平衡机制似懂非懂,另外你在介绍中说可以用在fatfs上,觉得非常难以实现

  4. zjy说道:

    你好,我想问一下这个用的话是否每次上电都需要调用这个WL_Flash_Config(&MWL_Flash);?另外就是出现坏块后是否自动跳过坏块去写

  5. lx说道:

    你好,仔细看了一下代码,对均匀磨损的机理还没有弄懂,能不能麻烦楼主将实现原理解释一下。我是菜鸟,见谅!

  6. L说道:

    有使用这个算法的人可以说下能不能实现吗,我移植完之后发现好像没法实现

    • L说道:

      @L 一直写入读取都在同一个地址,没有体现出磨损均衡的思想,可能是我没有理解透题主的思想

    • TaterLi说道:

      @L 逻辑层是一个地址,底层是轮换.

      • L说道:

        @TaterLi 嗯嗯,谢谢你的回复,但是我直接看的是BSP_QSPI_WRITE这个函数的地址,这个函数封装的是底层的SPI写入函数,发现一直是同一个地址,然后我试着对逻辑层的地址(WL_Flash_Write)进行写入和读取,发现还是再同一个地址上操作的

      • L说道:

        @TaterLi 每次擦除更新WL表变化的是POS的值,但是这个值对修改底层磨损地址好像没有太大关系,有关系的是move_count,但是这个值的变化只出现在POS>POS_MAX的时候,主要是这个地方很纠结,这是怎么实现的磨损平衡呢,希望不吝赐教!

  7. sss说道:

    没有看明白算法,可以留个联系方式,私下请教一下嘛?谢谢。

  8. ming说道:

    这个库应该是只支持一个buf在flash上的写入,比如你有两个东西要写,就需要config两块区域,不知道理解是否正确

    • TaterLi说道:

      @ming 目前这个库已并入esp-idf主线(v4.4之后),如果重擦除所有信息,是会计算出同一个物理地址的,目前esp-idf主线上的磨损平衡代码更可靠.具体看components/wear_levelling.

回复 TaterLi 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注