在失去连接时将数据存储到无线传感器网络中的闪存

问题描述 投票:0回答:1

我必须实施一个最佳解决方案,将传感器的值存储到 NOR 闪存中,并在失去连接时添加时间戳,并在连接恢复时发送到中央服务器。需要一个类似队列的实现。有人会建议一个开源或专有的实现,或任何相同的算法吗?它应该具有磨损均衡、写入故障安全和擦除故障安全等属性。

它是 256Mb Spansion NOR 闪存(S25FL256S)。如果没有连接,我每 60 秒只需要存储少于 64 字节(包括时间戳)。 Flash的页大小为256字节,扇区大小为256KB。 Flash的擦写次数为100,000次

embedded filesystems
1个回答
0
投票

一个简单的解决方案是使用 N 闪存扇区,其中 N > 1。理想情况下,扇区大小相等,如果仅需要少量数据存储,则较小的扇区效率更高。扇区开始为空白(全部为 0xFF)。理想情况下,每条记录都是扇区总大小的一个因素(因此 64 或 128 字节可能是不错的选择。每条记录包括:

<timestamp><data><integrity check> 

每条记录都按顺序且连续地写入闪存,但关键的是

<integrity check>
被写入 last。例如,
<integrity check>
可以是 CRC 或者只是
<timestamp>
的补码。我建议使用 time_t 类型的 Unix 纪元时间戳,因为它简单且通用。最后写入
<integrity check>
可以检测不完整的记录(例如由于写入期间断电)。

当跨越每个扇区边界时,下一个扇区将被擦除,从扇区 N-1 到 0,因此您将始终拥有至少 N-1 扇区的数据和最多 N 扇区的数据。 (这就是为什么大量的小扇区比少量的大扇区更好)。这种闪存页面的循环缓冲区提供磨损均衡。例如,假设 2 * 256k 扇区和每分钟写入一次的 64 字节记录,每页将每 2.844 天擦除一次,因此对于 100000 次擦除/写入周期的耐用性,闪存将持续 779 年。这有点矫枉过正,但这使用了恰好相当大的最小扇区数,您需要计算 N 和扇区大小的任何特定组合的耐用性:

(((*N* - 1) * sector_size) / record_size) * write_period * flash_endurance

例如,每分钟写入 64 字节记录的 2 x 4Kb 扇区只能持续 12 年。

启动初始化需要扫描闪存读取时间戳,找到不为 0xffffffff(或 64 位 time_t 为 0xffffffffffffffff)且通过完整性检查的最大编号时间戳,以便知道将下一条记录写入何处(紧接在这个“最近”记录之后。请注意,如果您确实想运行 779 年 - 甚至超过 2038 年 1 月 19 日,那么您需要 64 位时间戳,但对于大多数用途,您将使用 32 位时间戳 -至少在产品保修期内!)。

2 * 256kb 扇区实现保证至少 256kb 的历史数据可用,对于 64 字节记录,即略多于 68 小时。如果仅使用 2 个 4kb 扇区,则最短历史记录将缩短至 64 分钟。您可以仅在连接丢失时记录,但最好连续记录,然后让远程客户端在需要时通过开始/结束时间戳请求丢失的数据。这种方法将允许检索数据,即使数据因系统可检测到的连接丢失以外的原因“丢失”,并且它可以允许连接多个可能独立断开连接并需要独立恢复数据的客户端。

© www.soinside.com 2019 - 2024. All rights reserved.