今回はフラッシュとかRAMのお話です。
他の方々のサイトで同じような情報が載っていますが、メモがわりに自分で確認した結果をお話しておこうと思います。
この記事は JTAG でデバッグすることを前提にして書いています。
環境構築については こちら をご覧になってください。
ESP32テクニカルリファレンスマニュアル
マニュアルは こちら からダウンロードすることができます。
ESP32メモリーの内訳などは、このマニュアルの1章に書かれています。
組み込みのメモリーは
ROM : 448KB
SRAM : 520KB
RTC FAST : 8KB
RTC SLOW : 8KB
と書かれています。
下表が組み込みメモリーの表で、RTC FAST, SLOW の部分に赤線をひきました。
RTC FAST は Bus Type が Data (青)と Instruction(緑)の2通りがあります。
それぞれ 8KB になっているので、どちらかを選んで使うということでしょうか。
RTC SLOW は Data Instruction(赤)と書かれています。
こちらもどちらか選んで使うということでしょうか。
Instructionは命令ですから、プログラム(コード)用として使います。
続いてROMの448KBです。
以下の3つのブロックの総和で448KBになります。
Bus Type が Data の 64KB は const として使うのでしょうか。
それにしては大きいような気がします。
最後にSRAMの520KBです。
赤+青 = 520KB または 赤+緑= 520KB になります。
こちらもSRAM1の領域の 128KB は Data(青) または Instruction (緑)を選んで使うということでしょうか。
SPIフラッシュのサイズ
以下のコードで確認ができました。
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
Monitorで確認すると
8MB external flash と表示されました。
設定もコードもかえていないのですが、4MB と表示されることがありました。
何だったのか原因が良くわかっていません。
spi_flash_get_chip_size()内でブレークした様子を載せておきます。
フラッシュのサイズは g_rom_flashchip.chip_size から得ることができるようです。
8388608バイト(8Mバイト)と表示されています。
ヒープ領域
ヒープサイズというと一般的に次のようなイメージでしょうか。
ヒープサイズ = RAMのサイズ – 割り当てられたスタックサイズ – 静的な変数のサイズ
以下のコードでフリーのヒープ領域が確認できるようです。
printf("Free heap size: %d bytes\n", esp_get_free_heap_size());
printf("Internal free heap size: %d bytes\n", esp_get_free_internal_heap_size());
printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());
こちらの環境でMonitorを使って確認したところ
Free heap size: 292204 bytes
Internal free heap size: 292204 bytes
Minimum free heap size: 290856 bytes
と表示されました。
RAMは520KBということなので、起動した状態で結構なサイズが使われているのだなぁというのが感想です。
Internal と Minimun の違いについては解説を読みましたが良く理解できませんでした。
PSRAM
以下のコードでPSRAMのサイズを得ることができるようです。
multi_heap_info_t info;
heap_caps_get_info(&info, MALLOC_CAP_SPIRAM);
uint32_t bytes = info.total_free_bytes + info.total_allocated_bytes;
printf("PSRAM size: %d bytes\n", bytes);
printf("Free PSRAM size: %d bytes\n", heap_caps_get_free_size(MALLOC_CAP_SPIRAM));
だまって実行すると以下の結果になりました。
使えないのでしょうか。
PSRAM size: 0 bytes
Free PSRAM size: 0 bytes
コンフィグレータ(Run Menuconfig)から以下の項目にチェックを入れるとPSRAMが使えるようになることがわかりました。
Component config – ESP32-specific – Support for external, SPI connected RAM
設定した様子を載せておきます。
[*] の状態で機能を有効にすることができるようです。
設定を保存してビルドしておきます。
以下のコードでプログラムを実行して Monitor 結果を見てみました。
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
printf("Free heap size: %d bytes\n", esp_get_free_heap_size());
printf("Internal free heap size: %d bytes\n", esp_get_free_internal_heap_size());
printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());
multi_heap_info_t info;
heap_caps_get_info(&info, MALLOC_CAP_SPIRAM);
uint32_t bytes = info.total_free_bytes + info.total_allocated_bytes;
printf("PSRAM size: %d bytes\n", bytes);
printf("Free PSRAM size: %d bytes\n", heap_caps_get_free_size(MALLOC_CAP_SPIRAM));
実行結果です。
PSRAMのサイズが表示されました。
なるほど、Free heap, Minimum free heap の方は外部メモリーもヒープ領域に加算されることがわかりました。
8MB external flash
Free heap size: 4449223 bytes
Internal free heap size: 287687 bytes
Minimum free heap size: 4449223 bytes
PSRAM size: 4192151 bytes
Free PSRAM size: 4192151 bytes
ヒープサイズも増えたので大きなことができそうですね。(^_^)
実はPSRAMのサイズは8Mらしいのですが、なぜ少ないのか?については調査して別の機会にお話できたらと思います。
お疲れさまでした。