ESP32:频繁存储数据的最佳方式?

tsa*_*s88 18 memory storage flash-memory esp32

我正在ESP32-DevKitC板上开发一个C++应用程序,我可以在其中感应加速度计的加速度。应用程序的目标是存储加速度计数据,直到存储空间已满,然后通过 WiFi 发送所有数据并重新开始。在可能的情况下,micro 也会进入深度睡眠模式。

我目前正在使用 ESP32 NVS 库,它有很好的文档记录并且非常易于使用。该负面的,这是该库使用的闪存,因此很多著作,最终会降低驱动器

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

有没有其他可能做我想做的事但不使用闪存?

声明

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

rom*_*key 27

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

ESP32s 使用NOR 闪存,通常额定写入周期在 10,000 到 100,000 之间(现在 100,000 似乎是标准)。Flash 不能写单个字节;而不是写入字节的“页面”,我认为这是 256 个字节。因此,每个 256 字节页面的额定值至少为 100,000 个周期。当设备的额定循环次数为 100,000 次时,它可能至少可用 10 倍,但制造商不会做出超过 100,000 次的任何承诺。

SPIFFS(和 LittleFS,现在用于 ESP8266 Arduino Core)执行“磨损均衡”,以最大限度地减少特定页面的写入次数。所以如果重复修改一个文件的同一部分,它会自动写入不同的flash页面。FAT 的设计不适用于闪存存储;我会避免它。

具有磨损均衡功能的 SPIFFS 是否足以满足您的需求取决于您所需的设备寿命与您将写入的数据量和频率。

NVS 可能会执行某种程度的磨损平衡,但我不确定。在这里,在有 2 名 ESP 员工的论坛帖子中,他们都确认 NVS 确实做了某种形式的磨损平衡。NVS 最适合用于持久化不经常更改的配置信息等内容。对于存储经常更新的信息,这不是一个很好的选择。

你提到数据只需要在深度睡眠中存活。如果是这种情况,最好的选择(如果它足够大)是使用ESP32 的 RTC 静态 RAM。这块内存将在重新启动和深度睡眠模式下幸存下来,但如果电源中断,它将失去其状态。它是真正的 RAM,因此您不会因频繁写入而磨损它,并且写入时不会花费很多精力。问题是它只有 8KB。

如果 8KB 的 RTC RAM 不够用,并且您太频繁地写入太多数据而无法相信 SPIFFS 会没事,那么您最好的选择是 SD 卡。ESP32 可以与 SD 卡适配器通信。SD 卡使用NAND 闪存,它的寿命比 NOR 长得多,并且可以安全地覆盖多次(这就是为什么这类卡可用于 Raspberry Pi 等设备中的文件系统)。

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

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

  • 非常清晰和有用,谢谢@romkey!我一定会尝试 RTC RAM。幸运的是,看起来使用起来非常简单。 (3认同)