3. ファイルシステムとストレージ
ストレージモジュールは FAT および littlefs フォーマットの仮想ファイルシステムをサポートし、ボードがサポートする Zephyr DiskAccess または FlashArea (フラッシュマップ) APIによって支えられています。
3.1. ファイルシステムの自動マウント
Zephyr の MicroPython は、起動時に利用可能なストレージを自動的にマウントしようとします。
フラッシュストレージ (利用可能な場合):
/flashにlittlefs2ファイルシステムを使って自動的にマウントします。ファイルシステムが存在しない場合は、自動的に作成します。ディスク ストレージ (SD カードなど): 自動的に検出して
/<disk_name>にマウントします(例: SDカードの場合は /sd)。作業ディレクトリ: 作業ディレクトリは、マウントされたディスクが利用可能な場合はそのディスクに設定されます。フラッシュストレージが利用可能な場合は
/flashに設定されます。モジュール検索パス:
sys.pathは、マウントされたディスクごとの/<disk>/lib、およびフラッシュストレージの/flash/libを含むように自動的に更新します。
この自動マウントは _boot.py モジュールの起動時に実行します。ほとんどのユースケースでは、ファイルシステムを手動でマウントする必要はありません。
3.2. ディスクアクセス
zephyr.DiskAccess クラスは、SD カードなどのストレージデバイスにアクセスするのに使えます。このクラスは Zephyr ディスクアクセス API を使い、 vfs.AbstractBlockDev プロトコルを実装しています。
SD カードコントローラで使う場合、SD カードはブート時に存在し、取り外されていない必要があります。SDカードはブート時にファイルシステムによって自動検出され、初期化されます。ディスクアクセス経由で SD カードにアクセスするには、ディスクドライバインターフェイスとファイルシステムを使います(下記参照)。
利用可能なディスク名には DiskAccess.disks 属性を介してアクセスできます。この属性は、利用可能なディスク名のタプルを含みます(例: ('SDHC',) または ('SD',))。
mimxrt1050_evk ボード上の SD カードによる FatFS の使用例:
import vfs
from zephyr import DiskAccess
# List available disks
print(DiskAccess.disks) # 利用可能なディスク名を表示。例: ('SDHC',)
bdev = DiskAccess('SDHC') # DiskAccess を使ってブロックデバイスオブジェクトを作成
vfs.VfsFat.mkfs(bdev) # ディスクストレージブロックを使って FAT ファイルシステムを作成
vfs.mount(bdev, '/sd') # SD カード用のサブディレクトリにファイルシステムをマウント
with open('/sd/hello.txt','w') as f: # マウントしたディレクトリに新規ファイルをオープン
f.write('Hello world') # ファイルに書き出し
print(open('/sd/hello.txt').read()) # ファイルの内容を表示
注記: ほとんどの場合、ディスクは起動時に自動でマウントされるため、手動でマウントする必要はありません。
3.3. フラッシュ領域
クラス FlashArea -- 内蔵フラッシュストレージへのアクセス クラスは、低レベルのストレージシステムの実装やファイルシステム構成のカスタム化に使えます。デバイス上に永続的なデータを保存するには、より高レベルのファイルシステムAPIを使用することを推奨します(下記参照)。
このクラスは Zephyr Flash map API を使用し、 vfs.AbstractBlockDev プロトコルを実装しています。
利用可能なフラッシュ領域名には FlashArea.areas 辞書を介してアクセスできます。この辞書はパーティションラベルを ID (例: ) にマッピングしています(例: {'storage': 1, 'scratch': 4})。
次に示すのは reel_board または rv32m1_vega_ri5cy ボードの内蔵フラッシュでの使用例です:
import vfs
from zephyr import FlashArea
# List available flash areas
print(FlashArea.areas) # 利用可能な領域を表示。例: {'storage': 1, 'scratch': 4}
bdev = FlashArea(FlashArea.areas['storage'], 4096) # FlashArea を使ってブロックデバイスオブジェクトを作成
vfs.VfsLfs2.mkfs(bdev) # フラッシュエリアブロックを使って Little ファイルシステムを作成
vfs.mount(bdev, '/flash') # フラッシュストレージ用のサブディレクトリにファイルシステムをマウント
with open('/flash/hello.txt','w') as f: # マウントしたディレクトリに新規ファイルをオープン
the directory
f.write('Hello world') # ファイルに書き出し
print(open('/flash/hello.txt').read()) # ファイルの内容を表示"
注記: ほとんどの場合、フラッシュストレージパーティションは起動時に自動で /flash にマウントされ、必要に応じてファイルシステムが自動で作成されるため、手動でマウントする必要はありません。
frdm_k64f のように、MicroPython アプリケーションがデフォルトのフラッシュストレージパーティションを超えてしまうボードでは、 storage を scratch に置き換えてスクラッチパーティションを使うようにします。