ESP32:经常存储数据的最佳方法?

时间:2020-09-07 15:57:04

标签: memory storage esp32 flash-memory

我正在 ESP32-DevKitC 板上开发一个 C ++ 应用程序,在这里我可以感觉到加速度计的加速度。该应用程序的目标是存储加速度计数据,直到存储空间已满,然后通过WiFi发送所有数据,然后重新开始。微型计算机也会尽可能进入深度睡眠模式。

我目前正在使用ESP32 NVS库,该库文档齐全,易于使用。 消极的一面是该库使用闪存,因此很多著作最终都会使驱动器降级

我知道Espressif还提供了一些其他存储库(FAT,SPIFFS等),但是据我所知(如果我错了,请更正),它们都使用闪存驱动器。

是否有其他可能要做的但不使用Flash存储器的事情?

声明

  • 使用闪存本身不是问题,而是降级
  • 当微型计算机进入深度睡眠模式时,
  • 存储必须非易失性或至少不被擦除
  • 我没有使用任何Arduino库。

1 个答案:

答案 0 :(得分:7)

这是一个很好的问题,我希望更多的人会问。

ESP32使用NOR flash storage,通常将其定为10,000至100,000个写周期(目前看来,标准为100,000个)。 Flash无法写入单个字节;而不是写一个字节的“页面”,我相信是256个字节。因此,每个256字节的页面的额定值至少为100,000个周期。当一个设备的额定寿命为100,000个周期时,它可能至少可以使用10倍,但是制造商不会做出超过100,000个周期的承诺。

SPIFFS(以及现在用于ESP8266 Arduino Core的LittleFS)执行“耗损均衡”,以最大程度地减少写入特定页面的次数。因此,如果您重复修改文件的同一部分,它将自动写入Flash的不同页面。 FAT不适用于闪存。我会避免的。

带损耗均衡的SPIFFS是否足以满足您的需求,取决于设备所需的使用寿命以及要写入的数据量和频率。

据我所知,NVS不执行任何磨损平衡。 NVS最适合用于持久存储不经常更改的信息,例如配置信息。存储经常更新的信息不是一个很好的选择。

您提到数据只需要在深度睡眠中幸存即可。在这种情况下,最好的选择(如果足够大)是使用ESP32's RTC static RAM。该内存块将在重启和深度睡眠模式下幸免于难,但如果断电将丢失其状态。它是真正的RAM,因此您不会因频繁写入而耗尽它,并且写入时不会花费很多精力。渔获物只有8KB。

如果8KB的RTC RAM不够用,而您又写了太多数据,以至于不能相信SPIFFS可以用,那么最好的选择是使用SD卡。 ESP32可以与SD卡适配器通话。 SD卡使用NAND flash,其使用寿命比NOR大得多,并且可以安全地覆盖很多次(这就是为什么这种卡可用于Raspberry Pis等设备中的文件系统)。

写入闪存还比写入常规RAM消耗更多的能量。如果您的设备将由电池供电,那么从节能角度来看,RTC RAM还是比SPIFFS或SD卡更好的选择。

最后,如果您使用RTC RAM,我建议您在wifi满之前开始通过wifi进行写入,因为打开wifi和传输数据很容易会花费很长时间,以至于您可能没有足够的空间来存储某些样本。最好将其用作环形缓冲区并在达到高水位线时(而不是在缓冲区已满时)开始传输过程。