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>;