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')