編集履歴一覧に戻る
lipoyangのアイコン画像

lipoyang が 2026年03月30日17時38分11秒 に編集

初版

タイトルの変更

+

SPRESENEのメモリタイル使用状況の確認方法

タグの変更

+

SPRESENSE

+

Arduino

記事種類の変更

+

セットアップや使用方法

本文の変更

+

SPRESENSEの1.5MバイトのRAMはリニアな空間ではなく、128kバイトの「タイル」単位で各コアに割り当てられます。タイルは全部で 1.5Mバイト/128kバイト = 12枚あります。また、Spresense Arduino Library の```MP.AllocSharedMemory()```で共有メモリを使用すると、別途1タイル=128kバイトが共有メモリ用に割り当てられます。 → [Spresense Arduino 開発ガイド | 1.4. Arduino メモリサイズ変更](https://developer.spresense.sony-semicon.com/development-guides/?page=arduino_developer_guide&lang=ja#_tutorial_memory_config) タイルの使用状況を確認できるAPIとして、Spresense Arduino Library には ```MP.GetMemoryInfo()```があります。 ```MP.GetMemoryInfo()```は、使用メモリ、空きメモリ、最大連続空きメモリを取得するAPIですが、取得できる値は128kバイト刻みであり、これはまさしくタイルの使用状況を表します。```MP.GetMemoryInfo()```のソースを確認すると、各タイルのSRAMのオン/オフ状態を示すレジスタの値をチェックしているようです。 例えば、以下のようなコードでタイルの使用状況を確認できます。 ```cpp #include<Arduino.h> #include<MP.h> // タイルの使用状況を表示 void memprint(char* tag) { int usedMem; int freeMem; int largestFreeMem; MP.GetMemoryInfo (usedMem, freeMem, largestFreeMem ); usedMem /= (128 * 1024); freeMem /= (128 * 1024); largestFreeMem /= (128 * 1024); printf("[%s]GetMemoryInfo u = %d, f = %d, l = %d\n", tag, usedMem, freeMem, largestFreeMem); } void setup() { Serial.begin(115200); while(!Serial){;} // MP.AllocSharedMemoryのサイズ指定はタイル単位で切り上げられる memprint("Check Point 1"); // 1000バイトを指定しても1タイル=128kバイトが確保される uint8_t *sharedMem1 = MP.AllocSharedMemory(1000); memprint("Check Point 2"); // 129kバイトを指定したら2タイル=256kバイトが確保される uint8_t *sharedMem2 = MP.AllocSharedMemory(129 * 1024); memprint("Check Point 3"); } void loop() { ; } ``` 【実行結果】 ``` [Check Point 1]GetMemoryInfo u = 6, f = 6, l = 6 [Check Point 2]GetMemoryInfo u = 7, f = 5, l = 5 [Check Point 3]GetMemoryInfo u = 9, f = 3, l = 3 ```