Utilisation des systèmes de fichiers

Ce tutoriel décrit comment l’OpenMV Cam fournit un système de fichiers embarqué, permettant d’utiliser les méthodes d’entrée/sortie de fichiers standard de Python avec un stockage persistant.

L’OpenMV Cam crée une configuration par défaut, puis détecte et monte automatiquement le système de fichiers principal à la mise sous tension. Ce tutoriel est donc surtout utile si vous souhaitez repartitionner la mémoire flash, changer le type de système de fichiers ou utiliser un périphérique de blocs personnalisé.

Le système de fichiers s’appuie sur la mémoire flash interne, ou sur une carte SD lorsqu’une est installée.

VFS

MicroPython implémente une couche de système de fichiers virtuel (VFS) de type Unix. Tous les systèmes de fichiers montés sont combinés en un seul système de fichiers virtuel, débutant à la racine /. Les systèmes de fichiers sont montés dans des répertoires de cette structure, et au démarrage le répertoire de travail est défini sur le système de fichiers principal.

Sur l’OpenMV Cam, la mémoire flash interne est montée sur /flash et constitue le répertoire de travail. Si une carte SD est installée, elle est montée sur /sdcard et devient le répertoire de travail à la place.

Périphériques de blocs

Un périphérique de blocs est une instance d’une classe qui implémente le protocole vfs.AbstractBlockDev.

À la mise sous tension, l’OpenMV Cam tente de détecter le système de fichiers sur la mémoire flash interne (ou la carte SD), puis de le configurer et de le monter automatiquement. Si aucun système de fichiers n’est trouvé, un système de fichiers FAT couvrant la totalité de la mémoire flash est créé. Pour effacer ou reformater le système de fichiers embarqué, le plus simple est d’utiliser OpenMV IDE ou une réinitialisation d’usine ; l’API Python de plus bas niveau ci-dessous est destinée à un usage avancé/programmatique.

Mémoire flash interne

Sur les OpenMV Cam basées sur STM32, la classe pyb.Flash donne accès à la mémoire flash interne. Sur les cartes disposant d’une mémoire flash externe plus grande, elle l’utilisera à la place. L’argument nommé start doit toujours être spécifié, c’est-à-dire pyb.Flash(start=0).

Remarque : pour des raisons de compatibilité ascendante, lorsqu’elle est construite sans argument (c’est-à-dire pyb.Flash()), elle implémente uniquement l’interface de blocs simple et reflète le périphérique virtuel présenté au stockage de masse USB (c’est-à-dire qu’elle inclut une table de partition virtuelle au début).

Périphériques de blocs personnalisés

Vous pouvez également créer votre propre périphérique de blocs en Python et le monter — par exemple un disque RAM. La classe suivante implémente un périphérique de blocs simple qui stocke ses données en RAM à l’aide d’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

Il peut être utilisé comme suit

import vfs

bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')

Une fois monté, le système de fichiers peut être utilisé comme il le serait normalement depuis du code Python, par exemple

with open('/ramdisk/hello.txt', 'w') as f:
    f.write('Hello world')
print(open('/ramdisk/hello.txt').read())

Systèmes de fichiers

L’OpenMV Cam formate la mémoire flash interne en FAT afin que, sur les cartes qui exposent le système de fichiers via le stockage de masse USB, le PC hôte puisse le lire et y écrire sans pilotes supplémentaires.

FAT ne tolère pas les coupures de courant pendant les écritures, ce qui peut entraîner une corruption du système de fichiers. Éjectez/démontez le lecteur sur l’hôte avant d’éteindre la caméra, et privilégiez une carte SD plutôt que la mémoire flash interne pour les données que le script réécrit.

Sur les OpenMV Cam basées sur STM32, la mémoire flash interne peut être reformatée depuis 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')