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

时间:2016-03-13 05:45:51

标签: filesystems embedded wireless

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

这是一个256Mb Spansion NOR闪存(S25FL256S)。如果没有连接,我需要每60秒存储少于64字节(包括时间戳)。 flash的页面大小为256字节,扇区大小为256KB。闪光的擦除循环耐久性为100,000

1 个答案:

答案 0 :(得分:0)

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

<timestamp><data><integrity check> 

每个记录按顺序写入并连续写入闪存,但关键是<integrity check>写入最后<integrity check>可以是CRC,或者仅仅是<timestamp>的唯一补码。我建议使用类型为time_t的Unix Epoch时间戳,因为它简单而通用。最后写<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),并通过完整性检查,以便知道下一个写入的位置记录(紧接着这个&#34;最近的&#34;记录。注意如果你真的想要运行779年 - 甚至是2038年1月19日,那么你需要64位时间戳,但是对于大多数用途,您至少可以获得32 - 至少在产品保修期内!)。

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