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

FDS的GC操作

本文介绍FDS库的GC操作。 1. GC是什么 在FDS的概念中,写入Flash的数据以Record的形式保存。Record的格式为: Flash只能以32-bit的字(Word)为单位进行写操作。Record Header包含三个字,分别是: TL Part: Record Key和Data Length IC Part: File ID和CRC Value ID Part: Record ID 有效的Record Key范围是(0x0001 ~ 0xBFFF)。如果Record Key == 0x0000,表示它是一条无效数据,或脏数据(Dirty Record)。 删除Record,实际是将该数据设置为脏数据。 更新Record,实际是将该数据设置为脏数据,再写入一个新数据。 读取Record,将忽略所有脏数据。 所以,删除和更新Record都会产生脏数据。 经过反复的写入、更新和删除操作,有效数据和脏数据最终占满整个FDS区域,此时我们需要从Flash中删除脏数据以释放空间,这个过程称之为垃圾回收,简称GC(Garbage Collection)。 GC完成以后,FDS区域中的脏数据都被物理删除。 2. GC的步骤 Flash空间物理上分成不同的页,每页起始地址按Word对齐,每页长度固定为4kB(1024 words)。在程序中可以指定若干页为FDS区域(FDS Area)。 FDS在每页的起始地址写入两个字的页头(Page Head),将其标记为有效的FDS页。根据页头的不同,FDS页分为数据页和交换页: 数据页的页头:0xDEADC0DE F11E01FE 交换页的页头: 0xDEADC0DE F11E01FF 二者仅最后一个比特不同,交换页可以通过对该比特写0变成数据页,反过来则不行。 上图中,灰色底色的方块表示脏数据,黄色底色的方块表示有效数据,空白处表示没有数据。 它描述了GC的四个步骤: 将原数据页中的全部有效数据复制到交换页 擦除原数据页 将原交换页的页头改写成数据页 对原数据页写入交换页的页头 从图中我们可以读到以下有用信息: … Read more