MENU

ESP32 PSRAM的使用

• May 4, 2020 • Read: 538 • 折腾

ESP32可以扩展SPIRAM来弥补内存不足的情况,特别是在一些数据量比较大的场合。我在项目开发过程中,就遇到2个场合需要用到PSRAM。

Sqlite3

目前ESP32上比较全面而且通用的数据库,源代码地址
在数据库存储量比较大,而且增删改查操作比较频繁的情况下,ESP32内部的RAM显然是不够用的。这里我们修改一下源代码,往sqlite3.c里面找到如下定义:(大约在23454行)

#define SQLITE_MALLOC(x)             malloc(x)
#define SQLITE_FREE(x)               free(x)
#define SQLITE_REALLOC(x,y)          realloc((x),(y))

修改为:(issues)

void *auto_malloc(size_t size){
  if(!psramFound()){
    return malloc(size);
  }
  return ps_malloc(size);
}

void *auto_realloc(void *ptr, size_t size){
  if(!psramFound()){
    return realloc(ptr,size);
  }
  return ps_realloc(ptr,size);
}

#define SQLITE_MALLOC(x)             auto_malloc(x)
#define SQLITE_FREE(x)               free(x)
#define SQLITE_REALLOC(x,y)          auto_realloc((x),(y))

ArduinoJson

这是一个对Json数据进行处理的库,源代码地址
具体如何使用psram,官方有详细说明,链接
关键代码就是下面这个:

struct SpiRamAllocator {
  void* allocate(size_t size) {
    return heap_caps_malloc(size, MALLOC_CAP_SPIRAM);
  }
  void deallocate(void* pointer) {
    heap_caps_free(pointer);
  }
};

using SpiRamJsonDocument = BasicJsonDocument<SpiRamAllocator>;