以下の内容はhttps://mcommit.hatenadiary.com/entry/2026/02/16/204215より取得しました。


ESP32でのPSRAMへのstatic変数の配置について

ESP-IDFでアプリケーションを実装していると、メモリの問題に直面することがあります。
例えばESP32S3では、内蔵RAMが512KB搭載されていますが、これには命令キャッシュ専用のメモリ領域が含まれており、またブートローダやFreeRTOSのカーネルも内蔵RAMを使用するため、実際に開発者が利用できるのはおおむね400KB未満になります。
ESP32ではライブラリが充実していることもあり調子に乗って高機能なアプリケーションを実装しようとすると、内蔵RAMだけではすぐにメモリ不足になってしまいます。

この問題を解決するために、ESP32ではPSRAM(Pseudo Static RAM)を利用することができます。PSRAMは外部RAMとして接続され、大容量のメモリを提供します。これにより、内蔵RAMの制約を克服し、より複雑なアプリケーションを実装することが可能になります。
PSRAMはチップ外部のSPIで接続されている、MBオーダーの大容量RAMで、ESP32S3では最大16MBのPSRAMを利用することができます。

ただし、PSRAMはデフォルトでは無効になっているため、PSRAMを利用するためには、 menuconfigでPSRAMの設定を有効にする必要があります。
具体的には、CONFIG_SPIRAM_SUPPORT を有効にすることで、PSRAMを利用できるようになります。
これにより、malloc関数で確保する領域をPSRAMから確保できるようになります。また、タスクのスタックもPSRAMから確保できるようになります。
ちなみにPSRAMに関わらず、malloc/freeを使ってメモリの確保・解放を繰り返していると、メモリが断片化により最終的に、メモリを確保できなくなってしまう可能性があります。
利用頻度が高いは場合はあらかじめ必要なメモリを確保しておいた上で、確保したメモリを使いまわすことをお勧めします。

このように、PSRAMを利用することでメモリ不足の問題は解決できて、万事うまくいきそうですが、実際にはそうはいきません。

実は、AESなどの暗号化処理やTLS通信などでは、計算にDMAが利用されますが、内蔵メモリにデータが配置されていることが前提になっているため、
スタックをPSRAMから確保すると実行時にエラーが発生します。
このため暗号化計算を利用するタスクのスタックをPSRAMから確保することはできません。
また、PSRAMから確保した変数も暗号化計算などの処理で利用すると、実行時にエラーが発生する可能性があります。
最近ではHTTPもMQTTもTLS通信が前提になっているため、このような通信プロトコルを扱うタスクではPSRAMから確保した変数を暗号化計算などの処理で利用することはできません。
内蔵RAMから確保した変数を利用する必要があります。

内蔵RAMの使用量を節約するとなると、各タスクのスタックサイズを節約したいところですが、実は static変数(グローバル変数)もPSRAMから確保することができます。
ESP-IDFでは EXT_RAM_BSS_ATTR という属性を使用して、static変数をPSRAMに配置することができます。
具体的には以下のような宣言になります。

EXT_RAM_BSS_ATTR static uint8_t my_buffer[1024];

これにより、my_bufferはPSRAMに配置されます。
バッファなどの大きな変数はstatic変数として確保することが多いと思いますが、PSRAMに配置することで、内蔵RAMの使用量を節約することができます。
ちなみに static変数をPSRAMに配置するには menuconfigで CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY を有効にする必要があります。
注意点として、初期値のないstatic変数はBSSセクションに配置され、PSRAMから確保できますが、初期値のあるstatic変数はデータセクションに配置されるため、PSRAMから確保できません。
したがって、初期値のないstatic変数を使用する場合にのみ、EXT_RAM_BSS_ATTR を使用してPSRAMに配置することができます。

参考サイト

docs.espressif.com

体系的にESP-IDFを学びたい方へ

PSRAMの扱いはESP-IDF開発の中でも特につまずきやすいポイントの1つです。
本記事ではstatic変数をPSRAMに配置する方法を紹介しましたが、実際の開発では

  • FreeRTOSタスク設計
  • WiFi/BLE通信
  • NVSやLittleFSなどFlash管理
  • デバッグ方法(gdb)

なども含めて、全体像を理解しておくと開発中の遠回りが減ります。

ESP32・ESP-IDFについてUdemyで「実践で学ぶESP32・ESP-IDF入門講座」というコースを公開しています。
www.udemy.com

ESP-IDF開発を基礎から実機で学べる構成にしていますので興味ある方はぜひご視聴ください。




以上の内容はhttps://mcommit.hatenadiary.com/entry/2026/02/16/204215より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14