FDS的掉电分析
如果芯片在上一次操作Flash时遭遇了意外掉电 ,会发生什么呢? 1. 写入过程掉电 一个Record的写入按照如下顺序执行: TL Part ID Part Content IC Part 如果在前三步意外掉电,IC Part由于没有开始写入,所以File ID仍然是原始值0xFFFF。 File ID = 0xFFFF的数据也会被视为脏数据,在读取、更新、删除操作的时候,脏数据会被忽略。GC 过程会删除脏数据,收回空间。 如果在第四步掉电,IC Part有两种可能: 写入失败:File ID仍然是0xFFFF,情况同上 写入错误:CRC 校验将无法通过,应用代码可以得知 所以一旦我们开启了CRC校验,即可解决第四步出现的意外掉电情况。 (经过我有限的测试,在第四步掉电时,只遇到“写入失败”,完全没有遇到“写入错误”,一个猜测是芯片电源管脚上的电容余电保护Flash将单个Word写入完毕。) 2. 删除、更新过程掉电 FDS 的删除操作实际是将Record Key写成0x0000,使该数据成为脏数据。所以删除操作本质上仍然是写操作。 如果写Record Key失败,它并未变成0x0000,那么下次运行时FDS 会把它识别成有效数据。应用层程序应该有意识的去处理这种“删除失败”的情况。 更新操作实际是先删除原数据,再写入新数据。它的掉电情况与删除和写入一致。 3. 读取过程掉电 无需分析,没有任何影响。 4. GC过程掉电 GC 过程共有四个步骤,在第一步时掉电,GC 尚未开始,没有任何影响。 在其他三个步骤时掉电,都会影响到FDS 数据页和交换页的存在情况。这里使用一个标志位flag来标记各个页的类型,枚举出全部可能的情况: 如果是空白页,则flag = PAGE_ERASED 如果不是空白页 ,页头有效,是数据页,则flag = PAGE_DATA 如果不是空白页,页头有效,是交换页,页内空白,则flag … Read more