ファイルシステムの利用¶
このチュートリアルでは、OpenMV Cam がデバイス上のファイルシステムをどのように提供し、標準的な Python のファイル I/O メソッドを用いて永続ストレージを利用できるようにしているかを説明します。
OpenMV Cam は電源投入時にデフォルトの構成を作成し、プライマリファイルシステムを自動検出してマウントします。そのため、このチュートリアルは主に、フラッシュを再パーティション化したい場合、ファイルシステムの種類を変更したい場合、またはカスタムブロックデバイスを使用したい場合に役立ちます。
ファイルシステムは内蔵フラッシュメモリによって、またはSDカードが取り付けられている場合はSDカードによってバックアップされます。
VFS¶
MicroPython は Unix ライクな仮想ファイルシステム(VFS)レイヤーを実装しています。マウントされたすべてのファイルシステムは、ルート / を起点とする単一の仮想ファイルシステムに統合されます。ファイルシステムはこの構造内のディレクトリにマウントされ、起動時には作業ディレクトリがプライマリファイルシステムに設定されます。
OpenMV Cam では、内蔵フラッシュは /flash にマウントされ、作業ディレクトリになります。SDカードが取り付けられている場合は /sdcard にマウントされ、代わりにそちらが作業ディレクトリになります。
ブロックデバイス¶
ブロックデバイスは、vfs.AbstractBlockDev プロトコルを実装するクラスのインスタンスです。
電源投入時、OpenMV Cam は内蔵フラッシュ(またはSDカード)上のファイルシステムの検出を試み、自動的に構成してマウントします。ファイルシステムが見つからない場合は、フラッシュ全体にわたる FAT ファイルシステムが作成されます。オンボードのファイルシステムを消去または再フォーマットする最も簡単な方法は、OpenMV IDE または ファクトリーリセット を使うことです。以下の低レベル Python API は、高度な用途やプログラムによる利用のためのものです。
内蔵フラッシュ¶
STM32 ベースの OpenMV Cam では、pyb.Flash クラスが内蔵フラッシュへのアクセスを提供します。より大容量の外部フラッシュを搭載するボードでは、代わりにそちらが使用されます。start キーワード引数は常に指定すべきです。すなわち pyb.Flash(start=0) のようにします。
注意: 後方互換性のため、引数なしで構築した場合(すなわち pyb.Flash())は、単純なブロックインターフェースのみを実装し、USBマスストレージに提示される仮想デバイスを反映します(すなわち、先頭に仮想パーティションテーブルが含まれます)。
カスタムブロックデバイス¶
Python で独自のブロックデバイスを作成してマウントすることもできます。例えば RAM ディスクなどです。次のクラスは、bytearray を使ってデータを RAM に保存する単純なブロックデバイスを実装しています:
class RAMBlockDev:
def __init__(self, block_size, num_blocks):
self.block_size = block_size
self.data = bytearray(block_size * num_blocks)
def readblocks(self, block_num, buf):
for i in range(len(buf)):
buf[i] = self.data[block_num * self.block_size + i]
def writeblocks(self, block_num, buf):
for i in range(len(buf)):
self.data[block_num * self.block_size + i] = buf[i]
def ioctl(self, op, arg):
if op == 4: # get number of blocks
return len(self.data) // self.block_size
if op == 5: # get block size
return self.block_size
次のように使用できます:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
マウントされると、ファイルシステムは Python コードから通常どおりに使用できます。例えば次のようにします:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
ファイルシステム¶
OpenMV Cam は内蔵フラッシュを FAT としてフォーマットします。これにより、ファイルシステムを USB マスストレージ経由で公開するボードでは、ホストPCが追加のドライバなしで読み書きできます。
FAT は書き込み中の電源障害に対する耐性がなく、ファイルシステムの破損を招くことがあります。カメラの電源を切る前にホスト側でドライブをイジェクト/アンマウントし、スクリプトが書き戻すデータには内蔵フラッシュよりもSDカードを優先してください。
STM32 ベースの OpenMV Cam では、内蔵フラッシュは Python から再フォーマットできます:
import os, vfs, pyb
vfs.umount('/flash')
vfs.VfsFat.mkfs(pyb.Flash(start=0))
vfs.mount(pyb.Flash(start=0), '/flash')
os.chdir('/flash')