Bekerja dengan filesystem¶
Tutorial ini menjelaskan bagaimana OpenMV Cam menyediakan filesystem pada perangkat, memungkinkan metode I/O file Python standar digunakan dengan penyimpanan persisten.
OpenMV Cam membuat konfigurasi default dan secara otomatis mendeteksi serta memasang filesystem utama saat dinyalakan, sehingga tutorial ini paling berguna jika Anda ingin mempartisi ulang flash, mengubah jenis filesystem, atau menggunakan block device kustom.
Filesystem didukung oleh memori flash internal, atau oleh kartu SD jika kartu tersebut terpasang.
VFS¶
MicroPython mengimplementasikan lapisan Virtual File System (VFS) seperti Unix. Semua filesystem yang dipasang digabungkan menjadi satu filesystem virtual, dimulai dari root /. Filesystem dipasang ke direktori dalam struktur ini, dan saat startup direktori kerja diatur ke filesystem utama.
Pada OpenMV Cam, flash internal dipasang di /flash dan menjadi direktori kerja. Jika kartu SD terpasang, kartu tersebut dipasang di /sdcard dan menjadi direktori kerja sebagai gantinya.
Block devices¶
Block device adalah instansi dari sebuah kelas yang mengimplementasikan protokol vfs.AbstractBlockDev.
Saat dinyalakan, OpenMV Cam mencoba mendeteksi filesystem pada flash internal (atau kartu SD) dan secara otomatis mengonfigurasi serta memasangnya. Jika tidak ada filesystem yang ditemukan, filesystem FAT yang mencakup seluruh flash akan dibuat. Untuk menghapus atau memformat ulang filesystem di papan, cara termudah adalah melalui OpenMV IDE atau factory reset; API Python tingkat rendah di bawah ini digunakan untuk keperluan lanjutan/terprogram.
Flash internal¶
Pada OpenMV Cams berbasis STM32, kelas pyb.Flash menyediakan akses ke flash internal. Pada papan yang memiliki flash eksternal yang lebih besar, kelas ini akan menggunakan flash tersebut. Argumen kata kunci start harus selalu ditentukan, yaitu pyb.Flash(start=0).
Catatan: Untuk kompatibilitas mundur, ketika dibuat tanpa argumen (yaitu pyb.Flash()), hanya mengimplementasikan antarmuka blok sederhana dan mencerminkan perangkat virtual yang disajikan ke USB mass storage (yaitu mencakup tabel partisi virtual di awal).
Block device kustom¶
Anda juga dapat membuat block device sendiri di Python dan memasangnya — misalnya RAM disk. Kelas berikut mengimplementasikan block device sederhana yang menyimpan datanya di RAM menggunakan bytearray
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
Cara penggunaannya adalah sebagai berikut:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
Setelah dipasang, filesystem dapat digunakan seperti biasanya dari kode Python, misalnya:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
Filesystem¶
OpenMV Cam memformat flash internal sebagai FAT sehingga pada papan yang mengekspos filesystem melalui USB mass storage, PC host dapat membaca dan menulisnya tanpa driver tambahan.
FAT tidak toleran terhadap kegagalan daya saat menulis, yang dapat menyebabkan korupsi filesystem. Keluarkan/lepas drive di host sebelum mematikan kamera, dan lebih baik gunakan kartu SD daripada flash internal untuk data yang ditulis kembali oleh skrip.
Pada OpenMV Cams berbasis STM32, flash internal dapat diformat ulang dari 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')