lipoyangのアイコン画像
lipoyang 2026年03月30日作成
セットアップや使用方法 セットアップや使用方法 閲覧数 74
lipoyang 2026年03月30日作成 セットアップや使用方法 セットアップや使用方法 閲覧数 74

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

SPRESENSEの1.5MバイトのRAMはリニアな空間ではなく、128kバイトの「タイル」単位で各コアに割り当てられます。タイルは全部で 1.5Mバイト/128kバイト = 12枚あります。また、Spresense Arduino Library のMP.AllocSharedMemory()で共有メモリを使用すると、別途1タイル=128kバイトが共有メモリ用に割り当てられます。
Spresense Arduino 開発ガイド | 1.4. Arduino メモリサイズ変更

タイルの使用状況を確認できるAPIとして、Spresense Arduino Library には MP.GetMemoryInfo()があります。 MP.GetMemoryInfo()は、使用メモリ、空きメモリ、最大連続空きメモリを取得するAPIですが、取得できる値は128kバイト刻みであり、これはまさしくタイルの使用状況を表します。MP.GetMemoryInfo()のソースを確認すると、各タイルのSRAMのオン/オフ状態を示すレジスタの値をチェックしているようです。

例えば、以下のようなコードでタイルの使用状況を確認できます。

#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
lipoyangのアイコン画像
奈良県在住の組込み系なんでも屋。 そんなことよりハンダ付けしようぜ!
  • lipoyang さんが 前の月曜日の17:38 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する