考虑到闪存 MTBF,定期写入 ESP32 闪存多远才安全?

Sté*_*uca 1 persistence flash-memory esp32

定期写入闪存的最佳实践是什么?考虑到我正在开发的硬件应该有 10 到 20 年的使用寿命,您的建议是什么?例如,我可以每 15 分钟写入一些状态变量吗Preferences

Tar*_*rmo 9

这取决于

  • 您的闪存支持的擦除周期数,
  • 存储数据的 NVS 分区的大小以及
  • 您存储的数据的大小和结构。

擦除周期意味着闪存的单个扇区在不再保证正常工作之前可以被擦除多少次。该编号可在您使用的闪存芯片的数据表中找到。通常是10K或100K。

Preferences 库使用 ESP-IDF NVS 库。这需要 NVS 分区来存储数据,其大小决定为此目的保留多少闪存扇区。每次存储值时,NVS 都会将数据及其自身开销(对于整数和浮点等基本数据类型总共 32 个字节,对于字符串和 blob 则更多)写入当前闪存扇区。当当前扇区满时,擦除下一个扇区并继续写入;从而在写入请求到来时以循环方式用完扇区。

如果我们假设您的闪存有 100K 擦除周期,您的 NVS 分区大小为 128 KiB,并且每 15 分钟存储一组 8 个原始值(任何 int 或 float):

  1. 每个存储操作都使用8 * 32 = 256字节(每个数据值 32 B)。
  2. 您可以131072 / 256 = 512在写入 128KiB NVS 分区的每个扇区之前重复该操作(即擦除每个扇区一次)
  3. 您可以重复该循环 100K 次,这样512 * 100000 = 51200000在擦除每个扇区达到允许的最大次数之前,您可以执行大约 510 万次存储操作。
  4. 365 * 24 * 4 = 35040考虑到每年15 分钟的间隔会产生操作,51200000 / 35040 = 1461那么 Flash 还需要很多年才能消亡。

显然,如果您的闪存芯片额定擦除次数为 10K,那么它的寿命将降至只有 146 年。

那里可能有一些我没有考虑到的 NVS 开销,并且闪存擦除周期评级不是 100% 可靠,因此我将其削减一半以达到良好的效果 - 我预计在现实生活中可以使用 700 或 70 年。

如果您存储非原始值(字符串、blob),则估计值会根据该数据的长度而变化。我不知道如何计算它们使用的确切闪存空间,但我猜测 32B 加上数据长度乘以 NVS 开销的 10%。代入数字,自己看看。