把 ESP32 上额外的 PSRAM拿来模拟成一个磁盘,这个开源项目有点东西

 

大家好,今天跟大伙儿聊一个挺有意思的开源项目——ESP32-PsRamFS。说白了,这玩意儿能让你在 ESP32 的内存里划出一块地方,假装它是一个文件系统来用。

你可能会问:我好好的 SPIFFS 或者 LittleFS 不用,干嘛要把内存当硬盘使? 哎,这里头还真有点门道。

这玩意儿到底是干啥的?

咱先不扯那些官方文档里的套话啊。ESP32-PsRamFS 其实就是个**“冒牌货”文件系统** 。它把你 ESP32 上那个额外的 PSRAM(就是那个可以当内存用的外部存储芯片)的一部分,拿来模拟成一个磁盘。

什么意思呢?就是你写代码的时候,可以用读写文件的方式——比如 open、write、read 这些你熟悉的操作——但实际上数据是存在内存里的。读写速度比闪存快得多,而且不伤闪存寿命。

我自己试过之后的第一反应是:这不就是当年电脑里的虚拟内存盘(RAM Disk)吗? 对啊,就是把那个概念搬到了 ESP32 上 。


什么场景下用得着?

说实话,这玩意儿不是给所有项目准备的。官方的文档里有句话说得特别实在,我直接引用过来:

“Only use this if your situation requires a filesystem”

翻译成人话就是:除非你真得用文件系统那一套,否则别折腾这个。

那什么时候算“真得用”呢?我琢磨着有这么几种情况:

第一,你的程序要处理大量临时数据,频繁读写。比如说在做一个实时的数据采集器,每一秒都要往“文件”里写几十次数据。要是直接写闪存,用不了几天 SPIFFS 就报废了——闪存的写入寿命是有限的啊兄弟们。用 PSRamFS,随便写,不心疼。

第二,你从别处移植过来的代码,人家用的就是文件操作的逻辑,你懒得大改。这事儿我干过,真的是改代码改到想砸键盘。如果有这个库,直接把原来的文件操作往上套,底层自动给你重定向到内存里,省事儿。

第三,你要存一些临时生成的网页资源,但又不想每次重启都从闪存读。比如我见过有人拿它存摄像头拍的照片,然后通过网页往外发 。照片在内存里生成,直接从内存发出去,速度贼快,还不用在闪存里留痕迹。

怎么用?代码简单到让你怀疑人生

用起来倒是真不复杂,我给你们看一段核心代码:

#include <PSRamFS.h>

void setup() {
  Serial.begin(115200);
  
  // 划出一半的PSRAM来当“硬盘”
  PSRamFS.setPartitionSize(ESP.getFreePsram() / 2);
  
  if (!PSRamFS.begin()) {
    Serial.println("PSRamFS Mount Failed");
    return;
  }
  
  // 好了,现在你可以用PSRamFS来读写文件了
}

就这么几行,完事儿 。

而且它用的是 Arduino 标准的 fs::FS 接口,意味着你之前怎么用 SD 卡、怎么用 SPIFFS,现在就怎么用这个。学习成本几乎为零。

硬件上有什么讲究?

这个库的名字里带着 PsRam,所以最理想的硬件自然是带 PSRAM 的 ESP32 芯片。比如说经典的 ESP32-WROVER 模组,或者 ESP32-S2、S3、C3 这些系列也都支持 。

官方文档里其实说了,PSRAM 是可选的。但你想啊,如果不用 PSRAM,那就只能用 ESP32 那点可怜的内部 RAM——几百 KB 而已,随便存点啥就满了。所以强烈建议配上 PSRAM,不然这玩意儿的意义就不大了。

我的一点个人看法

聊到这儿,我想多说两句。

ESP32-PsRamFS 这种项目,其实反映了嵌入式开发里一个挺有意思的趋势:用更高级的抽象来处理硬件资源。以前我们写单片机程序,内存就是内存,直接读写地址。现在呢?我们居然可以在内存里建个文件系统,用 fopen 来操作它。

听起来有点“脱裤子放屁”对吧?但从软件工程的角度看,这其实是好事。它让代码的可移植性变强了,让上层逻辑和底层存储解耦了。你哪天不想用内存了,想改回 SD 卡,换一行代码就行,不用动业务逻辑。

当然,要付出的代价就是性能损耗。文件系统毕竟是一层封装,肯定比直接操作内存慢。但对于大多数 IoT 场景,这点损耗完全可以接受。

总结一下

如果你在做 ESP32 项目,需要频繁读写临时数据,又担心闪存寿命,或者想让代码结构更清晰,不妨试试 ESP32-PsRamFS。它可能不够完美,目录支持还是个半吊子,但基本功能足够用,而且用起来顺手。

最后提醒一句:因为这玩意儿数据是存在内存里的,一断电就没了。所以只适合存临时数据,千万别把配置信息或者证书啥的放进去,不然掉电就丢,有你哭的。


项目地址:https://github.com/tobozo/ESP32-PsRamFS

 

发表评论