新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > MAXQ处理器的非易失存储功能

MAXQ处理器的非易失存储功能

作者:时间:2016-09-12来源:网络收藏
1.jpg

图1. 数据单元报头结构

本文引用地址:http://www.eepw.com.cn/article/201609/303484.htm

写数据单元时,写子程序必须知道要写的数据、数据单元的长度和数据要写的位置。很容易可以知道数据写在哪个地址;无论是新数据单元还是更新已有的数据单元,都会写在存储阵列的末尾。写命令会搜索阵列的末尾,紧接着在最后一个记录后写入新的数据单元。假如在当前的存储页面没有足够的空间保存特定长度的数据元,就会出现页面结束标志并打开一个新页面。图2是这种典型的数据页面的结构。

在这个数据页面中,先写数据单元1,并更新。接着写数据单元4,但从不更新。随后是数据单元3,共更新7次。最后写入数据单元2,从不更新。

页面结束标志的出现表明曾执行写操作,但数据单元太长不能填入当前页面。会打开一个新页面以填写数据单元。在整个数据结构的末尾会分配一个空单元,这里本该是一个数据单元的报头。

2.jpg

图2. 典型的数据页面

要注意这种方案并没有涉及重复记录的问题。因为重复记录不会有问题。事实上,读和写程序都会完全忽略重复记录。写操作时,不管同样编号的记录是否存在,新记录都会写在阵列的末尾。当读操作时,只有符合请求记录编号的最后一个(所以是最近的)记录可以读到。

从阵列中读取数据元会比写操作更复杂。读功能会收到数据元编号和数据元应该写入的地址。当执行此命令时,读操作会从阵列的最开始进行搜索。当它找到一个记录符合被请求的数据元,它会保存这个地址并继续搜索。当它找到另外一个匹配的记录时,读命令会用新地址替代已保存的地址。当搜索到阵列的末尾时,保存的地址就会是符合请求记录的最近写入的记录。当执行读操作时,就会把这个数据复制到缓存中。

尽管所介绍的用来从存储阵列中保存和读取记录的主读机制是可行的,还会存在一个问题:没有机制可以重新使用被过时的记录占用的空间(也没有机制可以删除记录。但由于这种方案是针对嵌入式应用开发的,所以可能不会是个很严重的问题。)。如果不重新恢复一些空间,这些之前被分配的空间会很快用尽。由于闪存只能每次擦除一整个页面,恢复空间意味着擦除整个页面。另外一个更严重的问题是闪存页面不能被随便擦除,会存在删除有用信息的风险。唯一的可选方案是在删除整个旧页面之前,把有用信息复制到一个新页面。

从废旧的记录中恢复空间有三个步骤。第一,打开新页面,把每个数据元的最近版本复制到新页面中。第二,擦除旧页面。第三,对新页面做页面标示,是读命令可以找到新页面。

第一个步骤比较复杂,需要更详细的检查。完成这个步骤最简单的方法可以分成两个子步骤:第一,使用一个RAM保存记录编号和阵列中最近记录的地址;第二,从RAM阵列逐一复制最近记录到新闪存页面。这个过程最快,并且相对简单。

使用这两个子步骤存在的问题是2000只有1k字的RAM空间。上述方案限制了可以保存到RAM中作缓存的数据量。这明显是不能接受的。

这种难题的解决方案非常耗时,但不管存储阵列变得多大(合理范围内)都是可行的。为源阵列中的每一项条目单独操作,而不是在RAM中建立指针。因此,算法可以简化为:

从源阵列读取一个数据元。

在目标阵列中搜索这个数据单元。假如找到了,就说明这个数据单元已经写入。源指针增加并返回步骤1。

在源阵列中搜索这个数据单元最近记录。

把这个数据单元的最近记录写入目标阵列中。

源指针增加并返回步骤1。

最后,在目标阵列中,每个数据元都有精确的条目对应。填写后的页面如图3示意。这样,就可以安全擦除源页面,并把页面报头写入目标阵列。

空间恢复后

图3. 空间恢复后,图2中的数据页面会如此表现。

这个过程对于数据存储会非常安全。然而,当使用闪存器件时还要面对另一个风险:在写或者擦除操作中掉电。假如发生掉电,有可能会破坏一个或者多个页面 (例如写操作)或者不能完全擦除页面(例如擦除操作)。而我们这种紧凑的操作从本质上讲是安全的。可以考虑以下的情况:

假如在填写操作时掉电,源页面仍然保持完整。当重新上电后,很容易辨别新写的页面(他们没有页面报头)并把它擦除,再重新启动填写操作。

假如在正擦除旧页面时掉电,可能会包含无效的报头。可以擦除这些页面并把报头添加到新页面。

假如在正把页面报头写入到新页面时掉电,数据仍然是完整的。页面报头更新操作可以再次重新启动。

简言之,这些预料之外的突发事件不会导致阵列数据被破坏并不可恢复。

方案2的改进

这里介绍的存储子系统没有错误检测的机制。在数据元标识符中有一些位(这里的是6位)没有被使用。可以使用CRC6算法(x6 + x + 1)根据数据元计算出CRC以确保没有发生读写错误。这虽然不是特别强大的算法(它会错过多位错误中的1/64),它可以检测到多数可能发生的错误。

这个方法对系统的另一个限制是读取时间很长。每次读操作都需要读取阵列中的所有记录,以找到最近的记录。有3个方法可以用来缩短读取时间:

在数据单元中为正向指针留一个空字节。当数据更新时,为正向指针分配一个新的入口地址。按照这种方式,数据表格可以按链表的方式移动。

向后移动表格。这样就可以在被请求信号第一次出现时停止搜索。

假如单元数量很少,可以在启动时建立一个RAM阵列,包含单元ID和指针。后面的读取会很快。只需读RAM阵列以决定从哪儿获取数据单元。

结论

非易失数据存储是每位设计工程师迟早都必须面对的问题。使用灵活的闪存,就不用再借助于串行存储保存配置数据了。



评论


相关推荐

技术专区

关闭