ESP32-WROVERのPSRAMを使って大きな配列を作るテスト

ESP32

メモリの話は複雑で、いくつかのサイトを見た上でざっくりとまとめてるため、一部内容が間違ってるかもしれません。

ESP32で使える変数のサイズ

通常のESP32(-wroom)のRAM(変数用のメモリ)は520kBで、さらに変数として使えるのは100kB~200kB(モジュールによって違う?)なので、大きな画像データなどを扱おうとするとメモリが足りないよ、ということになる。

region `dram0_0_seg’ overflowed by 96032 bytes

こういう風に200kBの変数を定義して中に数字を入れると…
“region ‘dram0_0_seg’ overflowed by 96032 bytes”と表示される。(200KB-96KB=104kBしか使えない)

そのため、ESP32-wroverというモジュールはSPIで通信するRAM(PSRAM)が搭載されており、4MBとか8MBの変数を扱うことができる。(ただしArduino IDEで使えるのは4MBまで)

ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MB
https://akizukidenshi.com/catalog/g/g115674/

PSRAM関係の関数

bool psramFound()…PSRAMがあるかの判定

uint32_t ESP.getFreePsram()…フリーなPSRAMのサイズ(Byte)

uint32_t ESP.getPsramSize()…PSRAMのサイズ(Byte)

void* ps_calloc(size_t n, size_t size)…PSRAMの変数の確保。nが配列の数、sizeが配列一つのサイズ
例:char *p = (char*) ps_calloc( n, sizeof(char) );

void free(void* p)…メモリの解放

PSRAMがあるかチェックし、あれば4MBの変数配列を作るスケッチ

書き込み時には設定のPSRAMを”Enabled”にします。

実行結果

PSRAM Freeが4,192,124なので、このサイズまで配列が作れそうなのだが、私の環境ではなぜか4,120,000までしか配列が作れなかった。まあ4MBの配列は作れたのでひとまずOK。

まとめ

・100kB超えの変数を扱うときはPSRAM付きのESP32を使う
・PSRAMが8MBのものでもArduinoでは4MBまで(ESP-IDFでは8MB使えるらしい)
・書き込み設定のPSRAMを”Enabled”にする必要あり

コメント

タイトルとURLをコピーしました