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
さんが
前の月曜日の17:38
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する