Lavorare con i filesystem¶
Questo tutorial descrive come la OpenMV Cam fornisce un filesystem integrato nel dispositivo, consentendo l’uso dei metodi standard di I/O su file di Python con la memoria persistente.
La OpenMV Cam crea una configurazione predefinita e rileva e monta automaticamente il filesystem primario all’accensione, quindi questo tutorial è utile soprattutto se desideri ripartizionare la flash, cambiare il tipo di filesystem o usare un block device personalizzato.
Il filesystem si appoggia alla memoria flash interna, oppure a una scheda SD quando ne è installata una.
VFS¶
MicroPython implementa un livello Virtual File System (VFS) in stile Unix. Tutti i filesystem montati vengono combinati in un unico filesystem virtuale, a partire dalla radice /. I filesystem vengono montati in directory all’interno di questa struttura e, all’avvio, la directory di lavoro è impostata sul filesystem primario.
Sulla OpenMV Cam la flash interna è montata in /flash ed è la directory di lavoro. Se è installata una scheda SD, questa viene montata in /sdcard e diventa invece la directory di lavoro.
Block device¶
Un block device è un’istanza di una classe che implementa il protocollo vfs.AbstractBlockDev.
All’accensione la OpenMV Cam tenta di rilevare il filesystem sulla flash interna (o sulla scheda SD) e di configurarlo e montarlo automaticamente. Se non viene trovato alcun filesystem, viene creato un filesystem FAT che occupa l’intera flash. Per cancellare o riformattare il filesystem integrato il percorso più semplice è OpenMV IDE o un factory reset; l’API Python di più basso livello descritta di seguito è destinata a un uso avanzato/programmatico.
Flash interna¶
Sulle OpenMV Cam basate su STM32 la classe pyb.Flash fornisce l’accesso alla flash interna. Sulle schede che dispongono di una flash esterna più grande verrà utilizzata quest’ultima. Il kwarg start dovrebbe essere sempre specificato, cioè pyb.Flash(start=0).
Nota: per compatibilità con le versioni precedenti, quando viene costruita senza argomenti (cioè pyb.Flash()), implementa solo la semplice interfaccia a blocchi e riflette il dispositivo virtuale presentato all’archiviazione di massa USB (cioè include una tabella delle partizioni virtuale all’inizio).
Block device personalizzati¶
Puoi anche creare il tuo block device in Python e montarlo, ad esempio un disco RAM. La classe seguente implementa un semplice block device che memorizza i propri dati in RAM usando un 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
Può essere utilizzato come segue:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
Una volta montato, il filesystem può essere utilizzato normalmente dal codice Python, ad esempio:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
Filesystem¶
La OpenMV Cam formatta la flash interna come FAT in modo che, sulle schede che espongono il filesystem tramite archiviazione di massa USB, il PC host possa leggerlo e scriverlo senza driver aggiuntivi.
FAT non è tollerante alle interruzioni di corrente durante le scritture, il che può portare alla corruzione del filesystem. Espelli/smonta l’unità sull’host prima di spegnere la camera e preferisci una scheda SD alla flash interna per i dati che lo script riscrive.
Sulle OpenMV Cam basate su STM32 la flash interna può essere riformattata da 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')