トラブルシューティング
ESP32S3 版で、アプリを書き込むと再起動を繰り返す
ファンクションキーを押しながら電源ボタンを長押し (リセット) すると Xiamocon はアプリを起動する前にセーフモードに入ろうとします。 セーフモードでの起動が成功すれば、その状態でアプリを書き換えたり 電源ボタンで電源を切ることができます。
セーフモードでも再起動を繰り返す場合は、XIAO 本体基板の BOOT ボタンを押しながら 電源ボタンを長押し (リセット) してブートローダーを起動し、 再起動が発生しない正常なアプリを書き込んでください。
アプリが再起動を繰り返す原因は、アプリやライブラリのバグの場合もあればメモリ不足の場合もあります。 メモリ不足については「メモリ不足対策」の項を参照してください。
セーフモードでも再起動を繰り返す場合、静的に宣言された配列のための領域確保に失敗している可能性が濃厚です。 メモリの確保は new 演算子、malloc、または xmcMalloc 関数を使用して動的に行うことを推奨します。
メモリ不足対策
RP2350 版では 520kB の SRAM しか搭載していないので、そもそもその範囲内の使用に収める必要があります。
ESP32S3 版は 512kB の SRAM の他に 8MB の PSRAM を搭載していますが、 PSRAM を有効に活用するためには適切な方法でメモリ確保を実施する必要があります。
フレームバッファが使用するメモリを節約する
PSRAM は DMA に使用できないため、FrameBuffer クラスはバッファ領域を SRAM に確保します。 DMA で使用するため、このバッファ領域は物理的に連続していなければなりません。 RGB565 形式でダブルバッファを有効にすると、112.5kB の連続した領域が 2 つ確保されます。 これがどのように SRAM 上に配置されるかによっては、SRAM の空き空間が断片化され、 他の大きな配列領域などを SRAM 上に確保しようとして失敗する可能性があります。 これは Xiamocon が再起動を繰り返して制御不能になる主要な原因の一つです。
グラフィックスのパフォーマンスは低下しますが、ピクセルフォーマットを RGB444 にするか、 ダブルバッファを無効にすることでこの問題を回避しやすくなります。
フレームバッファ以外のメモリを PSRAM に確保する (ESP32S3 版)
大きな配列を静的に宣言したり new 演算子で確保する場合、領域がどこに確保されるかを制御できません。
int32_t largeArray1[1024];
xmcMalloc 関数を使用すると、領域を SRAM と PSRAM のどちらに確保するかを指定できます。 ESP32S3 版では、第二引数に XMC_HEAP_CAP_SPIRAM を指定すると PSRAM に確保されます。
int32_t *largeArray2 = (int32_t *)xmcMalloc(1024 * sizeof(int32_t), XMC_HEAP_CAP_SPIRAM);
RP3250 版では第二引数は無視され、常に SRAM に確保されます。
静的なデータをできるだけ Flash ROM に配置する
実行中に内容が変化しない静的なデータは const 修飾子を付けて宣言することで、Flash ROM に配置されます。