新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 利用基于闪存的MCU实现用户数据存储

利用基于闪存的MCU实现用户数据存储

作者: 时间:2008-06-11 来源:Maxim公司 Ben Smith 收藏

  方案1

本文引用地址:https://www.eepw.com.cn/article/84016.htm

  问题:校准信息、MAC地址或制造数据等配置数据必须要存储在产品中。虽然这些通常是固定不变的信息,但在整个产品生命周期内配置数据需要多次更新的可能性还是存在的。

  解决方案:下面是实际中最容易想到的例子。有两个块,一个块在字地址0x7E00处,另一个在0x7F00处,都用于数据存储。在第一次收到保存配置数据的命令时,处理器会检查这两个块,在发现它们都是空块后,配置数据被就存入第一个块。

  保存配置数据的第二条命令同样会使处理器再一次检查这两个块。当发现块0已经有数据后,它就将配置数据拷贝到块1,然后擦除块0中的数据。

  当收到恢复配置的请求时(比如在上电时),处理器会同时读取两个块的数据并确定哪个块在用。只要是没被擦除的块就是在用块。

  这种方案的主要优点是简单:如果设备在上电(或其他配置恢复事件)时需要块中的配置数据,这是很好的一种方案。读数程序会接受一个字长的指针,返回该地址的数值,写入程序则接受一个字长的指针,然后尝试向该地址进行写入操作。擦除程序只是同时擦除两个块。

  这种方案的主要缺点就是主要优点的反面:程序的思路太过简单。没有操作去判断写入数据是否成功—在发出写入命令后,如果写入失败,处理器不会做任何事去解决问题。这也是为什么这个方案只是用来写入已知是空的块的原因。

  方案2

  问题:要求用非易失性存储技术来跟踪用电量和其他经常变化的数据。更新经常是一周数次或一天数次发生。

  解决方案:这是即使传统也需要寻求帮助的场合。问题是:更新的频率和所有非易失性存储器有限的写入寿命这样的事实不允许反复写入和擦除单个单元。考虑一个小时更新一次的情况,具有1万次写入-擦除次数限制的只需一年时间就会失效,这个时间比电表所需的十年设计目标少得太多了。

  解决这个问题的方法之一是实现某种形式的“损耗均衡”。这意味着不会有单个位置被反复写数据。相反,写入操作将呈类似合理指数分布的方式分散到整个存储器阵列。

  损耗均衡是一种很好理解的技术,在器件中使用就是出于这个目的。但它的算法非常复杂和难以理解,不过对我们来说,一个更简单的原理介绍就足够了。

  存储阵列中的数据项是由数据单元(data element)号引用的,而不是地址。

  数据单元号是一个唯一识别数据单元的任意8位数,因此在这种方案中,最多有255个数据单元(数据单元0是保留单元)。

  每个数据单元有一个双字节的头部(见图2),包含了数据单元号和数据单元长度以及留给差错管理使用的足够空间,其中长度是一个两位代码,可表示1个、2个、3个或4个16位的字。

图2:数据单元的头部结构

  写一个数据单元需要知道写入数据的地址、写入数据的单元号和长度。写函数先寻找阵列结尾,然后紧跟最后一个记录之后写入新的数据单元。

  如果页中没有足够的空间容纳指定长度的记录,一个表示结尾的页标记将被写入,并会打开一个新的页。有关典型数据页的结构请见图3。

图3:典型的数据页

  在展开的数据页中,先写入经常要更新的数据单元1,再写入从不更新的数据单元4,然后写入需要多次更新的数据单元3。最后,写入从不更新的数据单元2。

  出现页的结尾标记表明过进行过一次数据写入尝试,但由于数据单元太长而无法将数据单元装进该页,因此打开了一个新页来容纳该数据单元。整个数据结构的结尾设定为空白单元,这个位置有望成为单元头部。

  值得注意的是,我还没有说明重复记录的问题。这是因为在这种方案中重复记录不是问题。事实上,读写程序是完全忽略重复记录的。

  在写数据时,新的记录会写在阵列的最后,而不管是否有相同号码的记录存在。在读数据时,只有匹配请求记录号的最后,也就是最近的记录被读出来。

  从阵列中读出一个数据单元要比写入稍微复杂一些。读函数首先接受应被写入数据单元内容的单元号码和地址。当被调用时,读函数从头开始搜索阵列。

  当它找到与请求数据单元相匹配的记录时,它将对应的地址先存起来,然后继续搜索。如果它找到另外一条匹配的记录,它就用新的地址代替刚才存储的地址。

  当到达阵列结尾时,最终存储的地址将指向最近写入拷贝的请求记录。读函数随即在被调用时将这个数据拷贝到缓存。

  复用存储器空间

  现在,我们已经有了一种以读取为主的可行机制用于从存储阵列中存取记录。剩下只有一个问题:我们还没有建立起复用被废弃的记录拷贝占用的空间。(我们也还没有建立删除记录的机制,但由于是用在嵌入式应用中,这可能不是一个很重要的特性)

  如果不恢复空间,分配的空间将很快用完。恢复空间意味着擦除整个页,因为闪存只能一次擦除一整页。但闪存页被随意擦除时将会出现删除有用信息的风险。唯一的方法是在擦除旧页时将有效信息拷贝到新的页。

  从废弃记录恢复空间要分三步走:首先,打开新的闪存页,将每个数据单元的最新版拷贝到新的页;然后,删除旧页;最后,在新页上放置页标记以便读程序能找到它们。



评论


相关推荐

技术专区

关闭