Trabalhar com sistemas de ficheiros¶
Este tutorial descreve como a OpenMV Cam disponibiliza um sistema de ficheiros no próprio dispositivo, permitindo utilizar os métodos padrão de E/S de ficheiros do Python com armazenamento persistente.
A OpenMV Cam cria uma configuração predefinida e deteta e monta automaticamente o sistema de ficheiros primário no arranque, pelo que este tutorial é sobretudo útil quando se pretende reparticionar a memória flash, alterar o tipo de sistema de ficheiros ou utilizar um dispositivo de blocos personalizado.
O sistema de ficheiros é suportado pela memória flash interna ou por um cartão SD quando este está instalado.
VFS¶
O MicroPython implementa uma camada de Sistema de Ficheiros Virtual (VFS) semelhante à do Unix. Todos os sistemas de ficheiros montados são combinados num único sistema de ficheiros virtual, com início na raiz /. Os sistemas de ficheiros são montados em diretórios nesta estrutura e, no arranque, o diretório de trabalho é definido como o sistema de ficheiros primário.
Na OpenMV Cam, a flash interna é montada em /flash e é o diretório de trabalho. Se estiver instalado um cartão SD, este é 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.
No arranque, a OpenMV Cam tenta detetar o sistema de ficheiros na flash interna (ou no cartão SD) e configurá-lo e montá-lo automaticamente. Se não for encontrado nenhum sistema de ficheiros, é criado um sistema de ficheiros FAT que abrange toda a flash. Para apagar ou reformatar o sistema de ficheiros interno, o caminho mais simples é o OpenMV IDE ou um reset de fábrica; a API Python de baixo nível abaixo destina-se a utilização avançada ou programática.
Flash interna¶
Nas OpenMV Cams baseadas em STM32, a classe pyb.Flash fornece acesso à flash interna. Nas placas com uma flash externa maior, será utilizada essa em alternativa. O argumento start deve sempre ser especificado, ou seja, pyb.Flash(start=0).
Nota: Para compatibilidade com versões anteriores, quando construído sem argumentos (ou seja, pyb.Flash()), implementa apenas a interface de blocos simples e reflete o dispositivo virtual apresentado ao armazenamento em massa USB (isto é, inclui uma tabela de partições virtual no início).
Dispositivos de blocos personalizados¶
Também é possível criar o seu próprio dispositivo de blocos em Python e montá-lo — por exemplo, um disco em RAM. A classe seguinte implementa um dispositivo de blocos simples que armazena os seus dados em RAM utilizando 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
Pode ser utilizado da seguinte forma:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
Uma vez montado, o sistema de ficheiros pode ser utilizado como normalmente seria 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 ficheiros¶
A OpenMV Cam formata a flash interna como FAT para que, nas placas que expõem o sistema de ficheiros através de armazenamento em massa USB, o PC anfitrião o possa ler e escrever sem controladores adicionais.
O FAT não é tolerante a falhas de energia durante as escritas, o que pode levar à corrupção do sistema de ficheiros. Ejete/desmonte a unidade no anfitrião antes de desligar a câmara, e prefira um cartão SD em vez da flash interna para os dados que o script escreve de volta.
Nas OpenMV Cams baseadas em STM32, a flash interna pode ser reformatada a partir de 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')