Trabalhando com sistemas de arquivos¶
Este tutorial descreve como a OpenMV Cam fornece um sistema de arquivos no dispositivo, permitindo que os métodos padrão de I/O de arquivos do Python sejam usados com armazenamento persistente.
A OpenMV Cam cria uma configuração padrão e detecta e monta automaticamente o sistema de arquivos primário na inicialização, portanto este tutorial é útil principalmente se você quiser reparticionar a flash, alterar o tipo de sistema de arquivos ou usar um dispositivo de blocos personalizado.
O sistema de arquivos é suportado pela memória flash interna ou por um cartão SD, quando há um instalado.
VFS¶
O MicroPython implementa uma camada de Sistema de Arquivos Virtual (VFS) semelhante à do Unix. Todos os sistemas de arquivos montados são combinados em um único sistema de arquivos virtual, começando na raiz /. Os sistemas de arquivos são montados em diretórios dentro dessa estrutura e, na inicialização, o diretório de trabalho é definido como o sistema de arquivos primário.
Na OpenMV Cam, a flash interna é montada em /flash e é o diretório de trabalho. Se um cartão SD estiver instalado, ele é montado em /sdcard e passa a ser o diretório de trabalho.
Dispositivos de blocos¶
Um dispositivo de blocos é uma instância de uma classe que implementa o protocolo vfs.AbstractBlockDev.
Na inicialização, a OpenMV Cam tenta detectar o sistema de arquivos na flash interna (ou cartão SD) e configurá-lo e montá-lo automaticamente. Se nenhum sistema de arquivos for encontrado, é criado um sistema de arquivos FAT que abrange toda a flash. Para apagar ou reformatar o sistema de arquivos integrado, o caminho mais fácil é o OpenMV IDE ou uma restauração de fábrica; a API Python de mais baixo nível abaixo é destinada a uso avançado/programático.
Flash interna¶
Nas OpenMV Cams baseadas em STM32, a classe pyb.Flash fornece acesso à flash interna. Em placas que possuem uma flash externa maior, ela usará essa em vez disso. O kwarg start deve sempre ser especificado, ou seja, pyb.Flash(start=0).
Nota: Por compatibilidade retroativa, quando construída sem argumentos (ou seja, pyb.Flash()), ela implementa apenas a interface de blocos simples e reflete o dispositivo virtual apresentado ao armazenamento em massa USB (ou seja, inclui uma tabela de partições virtual no início).
Dispositivos de blocos personalizados¶
Você também pode criar seu próprio dispositivo de blocos em Python e montá-lo — por exemplo, um disco em RAM. A classe a seguir implementa um dispositivo de blocos simples que armazena seus dados na RAM usando um 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
Ele pode ser usado da seguinte forma:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
Uma vez montado, o sistema de arquivos pode ser usado normalmente, como seria usado a partir de código Python, por exemplo:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
Sistemas de arquivos¶
A OpenMV Cam formata a flash interna como FAT para que, em placas que expõem o sistema de arquivos por armazenamento em massa USB, o PC host possa lê-lo e gravá-lo sem nenhum driver adicional.
O FAT não é tolerante a falhas de energia durante gravações, o que pode levar à corrupção do sistema de arquivos. Ejete/desmonte a unidade no host antes de desligar a câmera e prefira um cartão SD em vez da flash interna para os dados que o script grava de volta.
Nas OpenMV Cams baseadas em STM32, a flash interna pode ser reformatada a partir do 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')