Arbeiten mit Dateisystemen

Dieses Tutorial beschreibt, wie die OpenMV Cam ein geräteinternes Dateisystem bereitstellt, sodass die standardmäßigen Python-Datei-I/O-Methoden mit persistentem Speicher verwendet werden können.

Die OpenMV Cam erstellt beim Einschalten eine Standardkonfiguration, erkennt das primäre Dateisystem automatisch und bindet es ein. Daher ist dieses Tutorial vor allem nützlich, wenn Sie den Flash neu partitionieren, den Dateisystemtyp ändern oder ein eigenes Block-Device verwenden möchten.

Das Dateisystem wird durch den internen Flash-Speicher gestützt oder durch eine SD-Karte, falls eine installiert ist.

VFS

MicroPython implementiert eine Unix-ähnliche Virtual-File-System-Schicht (VFS). Alle eingebundenen Dateisysteme werden zu einem einzigen virtuellen Dateisystem zusammengefasst, beginnend bei der Wurzel /. Dateisysteme werden in Verzeichnisse dieser Struktur eingebunden, und beim Start wird das Arbeitsverzeichnis auf das primäre Dateisystem gesetzt.

Auf der OpenMV Cam wird der interne Flash unter /flash eingebunden und ist das Arbeitsverzeichnis. Ist eine SD-Karte installiert, wird sie unter /sdcard eingebunden und wird stattdessen zum Arbeitsverzeichnis.

Block-Devices

Ein Block-Device ist eine Instanz einer Klasse, die das Protokoll vfs.AbstractBlockDev implementiert.

Beim Einschalten versucht die OpenMV Cam, das Dateisystem auf dem internen Flash (oder der SD-Karte) zu erkennen und es automatisch zu konfigurieren und einzubinden. Wird kein Dateisystem gefunden, wird ein FAT-Dateisystem erstellt, das den gesamten Flash umfasst. Um das integrierte Dateisystem zu löschen oder neu zu formatieren, ist der einfachste Weg die OpenMV IDE oder ein Werksreset; die untenstehende Python-API auf niedrigerer Ebene ist für fortgeschrittene/programmatische Verwendung gedacht.

Interner Flash

Auf STM32-basierten OpenMV Cams bietet die Klasse pyb.Flash Zugriff auf den internen Flash. Auf Boards mit größerem externem Flash wird stattdessen dieser verwendet. Das Schlüsselwortargument start sollte immer angegeben werden, d.h. pyb.Flash(start=0).

Hinweis: Aus Gründen der Abwärtskompatibilität implementiert es bei Konstruktion ohne Argumente (d.h. pyb.Flash()) nur die einfache Block-Schnittstelle und spiegelt das virtuelle Gerät wider, das dem USB-Massenspeicher präsentiert wird (d.h. es enthält am Anfang eine virtuelle Partitionstabelle).

Eigene Block-Devices

Sie können auch Ihr eigenes Block-Device in Python erstellen und einbinden — zum Beispiel eine RAM-Disk. Die folgende Klasse implementiert ein einfaches Block-Device, das seine Daten mit einem bytearray im RAM speichert:

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

Es kann wie folgt verwendet werden:

import vfs

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

Nach dem Einbinden kann das Dateisystem ganz normal aus Python-Code verwendet werden, zum Beispiel:

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

Dateisysteme

Die OpenMV Cam formatiert den internen Flash als FAT, sodass der Host-PC bei Boards, die das Dateisystem über USB-Massenspeicher bereitstellen, es ohne zusätzliche Treiber lesen und schreiben kann.

FAT ist nicht tolerant gegenüber Stromausfällen während Schreibvorgängen, was zu Dateisystembeschädigung führen kann. Werfen Sie das Laufwerk auf dem Host aus bzw. binden Sie es aus, bevor Sie die Kamera ausschalten, und bevorzugen Sie für Daten, die das Skript zurückschreibt, eine SD-Karte gegenüber dem internen Flash.

Auf STM32-basierten OpenMV Cams kann der interne Flash aus Python neu formatiert werden:

import os, vfs, pyb
vfs.umount('/flash')
vfs.VfsFat.mkfs(pyb.Flash(start=0))
vfs.mount(pyb.Flash(start=0), '/flash')
os.chdir('/flash')