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

ESP32: Best way to store data frequently?

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

我目前正在使用 ESP32 NVS 库,它有很好的文档记录并且非常易于使用。 不利的一面是库使用闪存,因此大量写入最终会降低驱动器

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

有没有其他方法可以在不使用闪存的情况下做我想做的事情?

声明

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

ESP32 使用 NOR flash storage,其额定写入周期通常在 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 可能会执行某种程度的磨损均衡,我不确定在某种程度上。 Here, in a forum post with 2 ESP employees, they both confirm that NVS does do some form of wear levelling。 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 和传输数据很容易花费足够长的时间,您可能 运行 space 一些示例。将它用作环形缓冲区并在您达到高水位线而不是缓冲区已满时开始传输过程可能是您最好的选择。

我知道我回答晚了,但你可以购买带有外部 RAM 的 ESP32 模块,即使是 4-8mb。外部 ram 非常快(至少比 flash 快很多,它使用 SPI 接口进行通信)并且您可以在其中容纳很多传感器读数。

我正在使用带有 8mb 外部内存(4mb 可用于正常函数调用)和 16mb 闪存的 ESP32_WROVER_E 模块。

这是我在 TME 网站上使用的模块的 link