本帖最后由 gbchang 于 2017-7-13 19:43 编辑
既然固定地址0 用于存放空白flash地址, 不如每次上电时重新查找空白区, 如果顺序存储的话, 很快就找到了(bug.遇整包数据是全1时行不通).
如果非要在开头存一个地址, 可以用追加(而非改写)的方式, 例如 0 扇区有512byte, 用来存32位地址(4byte)的话, 就可以存128次, 那这128次是不需要擦除的, 就有了128ms时间. 此期间把 1 扇区擦掉(可惜帖主flash不能后台擦除,只好"进一步思考")用来备用, 如此循环利用 0/1 扇区双缓冲切换, 则可实现不间断存储了. 如果每包数据占1扇区, 闪存芯片共258个扇区, 那整个芯片用完刚好可以重头再来.
进一步思考, 你用的闪存芯片应该不只2+256个扇区, 从flash寿命来说, 显然那这 0/1 扇区会提前报废, 那就要计算一下, 需要预留多少扇区用于存放索引了: 索引扇区数*128=数据扇区数.
精益求精一点, 利用一般flash可以按位由1变0的特点(stm32内的flash不行,写前必须整字16位全1), 来提高索引区的利用率. 方法是: 把4字节的地址存储方式, 改为按位存储法. 即每次只写入一个bit(位0), 用0的个数表示地址值, 这样一个扇区就可以表示512*8=4K个地址, 远远高于前述32位地址表示法(128个)了. 当然, 这是一个以时间换空间的方法, 程序读写地址时要付出额外的运算.
对于频繁存储的flash, 例如SSD都会做损耗平衡算法的, U盘也会做一些简单的平衡.
|