Trabajar con sistemas de archivos¶
Este tutorial describe cómo la OpenMV Cam proporciona un sistema de archivos en el propio dispositivo, lo que permite utilizar los métodos estándar de E/S de archivos de Python con almacenamiento persistente.
La OpenMV Cam crea una configuración predeterminada y detecta y monta automáticamente el sistema de archivos principal al encenderse, por lo que este tutorial resulta útil principalmente si quieres reparticionar la memoria flash, cambiar el tipo de sistema de archivos o utilizar un dispositivo de bloques personalizado.
El sistema de archivos se respalda en la memoria flash interna, o en una tarjeta SD cuando hay una instalada.
VFS¶
MicroPython implementa una capa de sistema de archivos virtual (VFS) similar a la de Unix. Todos los sistemas de archivos montados se combinan en un único sistema de archivos virtual, que comienza en la raíz /. Los sistemas de archivos se montan en directorios dentro de esta estructura, y al arrancar el directorio de trabajo se establece en el sistema de archivos principal.
En la OpenMV Cam, la memoria flash interna se monta en /flash y es el directorio de trabajo. Si hay una tarjeta SD instalada, se monta en /sdcard y pasa a ser el directorio de trabajo en su lugar.
Dispositivos de bloques¶
Un dispositivo de bloques es una instancia de una clase que implementa el protocolo vfs.AbstractBlockDev.
Al encenderse, la OpenMV Cam intenta detectar el sistema de archivos en la memoria flash interna (o la tarjeta SD) y configurarlo y montarlo automáticamente. Si no se encuentra ningún sistema de archivos, se crea un sistema de archivos FAT que abarca toda la memoria flash. Para borrar o reformatear el sistema de archivos integrado, lo más sencillo es usar OpenMV IDE o un restablecimiento de fábrica; la API de Python de más bajo nivel que se describe a continuación es para uso avanzado o programático.
Memoria flash interna¶
En las OpenMV Cam basadas en STM32, la clase pyb.Flash proporciona acceso a la memoria flash interna. En las placas que tienen una memoria flash externa más grande, se usará esa en su lugar. El argumento por palabra clave start siempre debe especificarse, es decir, pyb.Flash(start=0).
Nota: por compatibilidad con versiones anteriores, cuando se construye sin argumentos (es decir, pyb.Flash()), solo implementa la interfaz de bloques simple y refleja el dispositivo virtual que se presenta al almacenamiento masivo USB (es decir, incluye una tabla de particiones virtual al principio).
Dispositivos de bloques personalizados¶
También puedes crear tu propio dispositivo de bloques en Python y montarlo, por ejemplo un disco RAM. La siguiente clase implementa un dispositivo de bloques sencillo que almacena sus datos en 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
Se puede usar de la siguiente manera:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
Una vez montado, el sistema de archivos se puede usar como se usaría normalmente desde código Python, por ejemplo:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
Sistemas de archivos¶
La OpenMV Cam formatea la memoria flash interna como FAT para que, en las placas que exponen el sistema de archivos a través del almacenamiento masivo USB, el PC anfitrión pueda leerlo y escribirlo sin controladores adicionales.
FAT no tolera los cortes de energía durante las escrituras, lo que puede provocar la corrupción del sistema de archivos. Expulsa o desmonta la unidad en el anfitrión antes de apagar la cámara, y prefiere una tarjeta SD frente a la memoria flash interna para los datos que el script vuelva a escribir.
En las OpenMV Cam basadas en STM32, la memoria flash interna se puede reformatear desde 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')