
今回はXBee 3のフラッシュメモリとRAM容量に関して解説します。DigiによるとXBee 3モジュールは、1MBのフラッシュメモリと96KBのRAMを搭載しています。
1.RAM
まずRAMについてMicriPython Terminalで以下の2点について確認していきます。
(1)メモリ空き容量の確認方法
print(“Free RAM:”, gc.mem_free(), “bytes”)
(2)GC(ガベージコレクション)の呼び出し
以前も解説しましたが、書き込み後などにgc.collect()を手動で呼び出すことで、メモリを効率的に使用できます。
import gc
gc.collect()
print(“Free RAM:”, gc.mem_free(), “bytes”)
上記のコードをMicroPython Terminalで実行した結果を以下に示します。

トータルの RAM は 96KBですが、システム領域(RTOS、スタック、通信バッファ等)で約60〜66KB程度を占有しており、残り約30KBをユーザが使用することができます。
2.フラッシュメモリ
それでは次にフラッシュメモリの容量を確認するため、以下のコードをMicroPython Terminalで実行します。
import os
stat = os.statvfs("/flash")
total = stat[0] * stat[2]
free = stat[0] * stat[3]
used = total - free
print("【/flash Capacity Information】")
print("Total capacity: {} bytes".format(total))
print("Used: {} bytes".format(used))
print("Free space: {} bytes".format(free))
結果を以下に示します。

この結果では全容量が約6.258MB、使用領域が約4kB、空き領域が6.254MBと表示され、XBee3の仕様と矛盾する結果が表示されています。XBee3の1MBフラッシュのうち、一部はMicroPythonファイルシステム用、あるいはファームウェア本体や設定領域に使用されています。また、MicroPythonは内部的にファイルシステム領域をRAM上または一時的な仮想領域としてマウントすることがあり、それがstatvfs()で確認した際に6MBと見えています。実際には、6MBをユーザが使えるわけではありません。それではユーザが使用できる容量はどの程度なのでしょうか。これを確認するため、以下のコードを実行します。このコードは約1KBずつ書き込みをどこまで書き込みが可能か確認するコードです。
i = 0
try:
with open("/flash/testfile", "w") as f:
while True:
f.write("0123456789ABCDEF" * 64) # 1KBずつ書き込み
i += 1
except Exception as e:
print("Write stopped at:", i * 1024, "bytes")
print("Exception:", e)
実行して10数秒経過すると以下の結果が表示されます。
フラッシュメモリの容量は1MBですが、ユーザが使用可能な要領は約386KBであることを確認することができます。

XBee3 のフラッシュメモリは以下のように使われています。
領域 | 用途 | 容量の目安 | 備考 |
無線スタック・OS・ブートローダ | ThreadX RTOS及び Zigbee/DigiMeshスタックなどのファームウェア本体の領域 | 500〜600KB程度 | 無線プロトコル、ATコマンド処理、OTA、セキュリティ機能など含む |
MicroPython インタプリタ + ランタイム | MicroPython のコードと関連データの領域 | 数十KB〜100KB程度 | - |
設定・NVM 領域 | ATパラメータ、キー、証明書などの領域 | 数十KB程度 | 書き換え可能だがユーザから直接アクセスできない |
OTA 領域(ファームウェア更新用) | ファームウェアの新旧切り替え用として使用 | 数十KB〜数百KB程度 | デバイスをリモート更新するために使う |
/flash ファイルシステム | ユーザデータとしてMicroPythonスクリプトやファイル | 300〜400KB程度 | MicroPythonのosから操作可能 |
ここで、ThreadX RTOS(リアルタイムオペレーティングシステム)とは、マイクロソフトが提供する組み込みシステム向けのリアルタイムOSです。