微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 利用基于闪存的MCU实现用户数据存储

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

时间:08-24 来源:Maxim公司工程经理:Ben Smith 点击:
方案2

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

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

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

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

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

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

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

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


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

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

图3:典型的数据页


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

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

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

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

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

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

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

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

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

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

第一步有些技巧,因此我们稍详细地进行介绍。执行这一步的简单方法是将它分成两小步:第一步,使用RAM阵列存储记录号和阵列中最新记录的地址;第二步,穿过RAM阵列将最新的记录拷贝到新的闪存页。这个过程很快,相对也比较顺利。

这种方案的问题是所用处理器(见图1)的RAM为1K字。这种方案将限制可存储进RAM中的单一数据数量,因为这个RAM还要节省下来用作缓存。这是明显不能接受的。

这种解决方案非常耗时,但不管存储阵列多大(在合理范围内)都能正常工作。该方案不会在RAM中创建一份指针列表,而是针对每个单一条目(entry)在源阵列中作多次穿越。因此压缩算法变为:

1. 从源阵列中读一个单元;

2. 在目标阵列中寻找该单元。如果找到了,表示这个单元已经被写入。增加源指针值,回到第(1)步;

3. 扫描源阵列寻找单元的最新拷贝;

4. 将数据单元的最新拷贝写入目标阵列;

5. 增加源指针,并回到第(1)步。

最终,在目标阵列中每个数据单元都有一个唯一的条目。图4描述了一个已填满的页。源页现在可以被安全地删除,页的头部被写入到目标阵列。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top