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

Memory ESP32:频繁存储数据的最佳方式?,memory,storage,esp32,flash-memory,Memory,Storage,Esp32,Flash Memory,我正在ESP32 DevKitC板上开发一个C++应用程序,在那里我可以感应加速度计的加速度。应用程序的目标是存储加速计数据,直到存储空间已满,然后通过WiFi发送所有数据并重新启动。如果可能,micro也会进入深度睡眠模式 我目前正在使用ESP32NVS库,它有很好的文档记录,并且非常易于使用。消极的一面是库使用闪存,因此大量的书写将导致驱动器降级 我知道Espressif还提供一些其他存储库(FAT、SPIFF等),但据我所知(如果我错了,请纠正我),它们都使用闪存驱动器 有没有其他不使用闪

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

我目前正在使用ESP32NVS库,它有很好的文档记录,并且非常易于使用。消极的一面是库使用闪存,因此大量的书写将导致驱动器降级

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

有没有其他不使用闪存就可以做我想做的事情的可能性

Aclarations

  • 使用闪存本身不是问题,而是降低闪存的性能
  • 当micro进入深度睡眠模式时,存储器必须非易失性或至少未被擦除
  • 我没有使用任何Arduino图书馆

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

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

      SPIFF(以及现在用于ESP8266 Arduino堆芯的LittleFS)执行“磨损均衡”,以最小化特定页面的写入次数。因此,如果重复修改文件的同一部分,它将自动写入flash的不同页面。FAT的设计不适合闪存存储;我会避免的

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

      NVS可能会执行某种程度的磨损均衡,我对此不确定。NVS最好用于持久化不经常更改的配置信息。对于存储经常更新的信息来说,它不是一个很好的选择

      你提到数据只需要熬过深度睡眠。如果是这样的话,您最好的选择(如果它足够大)就是使用。这段内存将在重启和深度睡眠模式下存活,但如果电源中断,它将失去状态。它是真正的RAM,所以您不会因为频繁写入而耗尽它,而且写入它也不会花费很多精力。问题是它只有8KB

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

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


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

      您是否正在缓冲数据,直到可以写入完整的页面?@CWallach我想我没有。每次我的加速计在其FIFO缓冲区溢出时,我都会读取缓冲区并使用
      nvs\u set\u blob()
      和缓冲区数据。每次这样做时,我都会创建一个新的对键:value。更准确地说,每个密钥包含300字节。有几个问题:(1)在通过WiFi发送之前,您收集了多少数据?(2) 数据丢失是一个问题吗(这就是为什么要将其存储在NVS中)?@mzimmers(1)我必须考虑功耗,因此我应该仅在存储空间已满时使用WiFi。据Espressif称,闪存存储容量为4MB。(2) 是的,我不能丢失数据。好的。嗯,罗姆基的回答很好。TL;如果您无法承受数据丢失(数据量非常大),则NVS系统是模块上的唯一选项。当然,您可以自由添加其他形式的外部存储。既然你没有说相反的话,我假设NVS系统的性能足以满足你的需要。非常清楚和有用,谢谢@romkey!我一定会尝试RTC RAM。幸运的是,看起来使用起来非常简单。我不是flash专家,但flash不允许在已经擦除的块中写入单个单词(与擦除相反,擦除只能按块进行)?您可以擦除整个闪存,然后缓慢地向其中写入单词(每个单词/字节仅一次),直到内存已满,然后再次擦除所有内容。我认为擦除过程会使芯片性能下降,并将其降至绝对最低。以上评论正是SPIFFS所做的。不幸的是,情况可能不再如此,因为一些蹩脚的PUYA品牌闪存芯片没有表现出这种行为,并且破坏了兼容性。因此,它已被弃用,因此您可能需要自己实现它。另外,还有I2C和SPI外部FRAM、MRAM和EERAM芯片可用。前两个是非易失性RAM,每个字节有数百万个以上的重写周期,后一个是