Flash操作是往里面写0,按照平时的逻辑,每次参数发生了改变,首先将整页擦除,再往里面写东西
例如我需要保存uint32_t
data_i[14]
只要 data_i[] 的数据发生了改变,那我就需要将这2k Flash
(页)全部擦除,然后重新写入新的数据
那问题来了,Flash的擦除次数是有限的,频繁地进行擦除,早晚会出问题
从上面的操作中我们可以发现,真正造成寿命损耗的是保存data_i[14]
位置,其余位置都是保持0xFF,擦除的时候并没有造成损耗。
从上面的例子中发现,2k Flash
我们才利用到它的冰山一角。我们解决Flash寿命问题,使用的是“空间换时间”方法。
意思是 牺牲2k flash
全部空间(就是将所有的空间都使用上),换取Flash更长的使用寿命。
首先我们定义一下我们保存的数据结构,uint32_t data_i[]
数组是我需要存储的数据(前面介绍存储的是14个参数,现在是20个,后面的6个是预留的,使用这个方法需要做好预留的准备)
在需要保存数据的前面设置了一个uint32_t
的标志位0xaaaaaaaa
程序其实就是每次首先读取第一个32位的数据是否等于0xaaaaaaaa
然后偏移到下一个位置读取标志位
偏移量 = uint32_t
21*4 = 84字节
当2k的空间全部写满后,再将页擦除。
以前是写一次,擦一次
2k / 84字节 = 24
现在是可以写24次才擦一次,寿命提高了24倍