Munka a fájlrendszerekkel

Ez az oktatóanyag azt mutatja be, hogyan biztosít az OpenMV Cam egy eszközön belüli fájlrendszert, amely lehetővé teszi a szabványos Python fájl I/O metódusok használatát a tartós tárolással.

Az OpenMV Cam bekapcsoláskor létrehoz egy alapértelmezett konfigurációt, valamint automatikusan felismeri és csatolja az elsődleges fájlrendszert, így ez az oktatóanyag főként akkor hasznos, ha újra szeretnéd particionálni a flash memóriát, meg szeretnéd változtatni a fájlrendszer típusát, vagy egyéni blokkeszközt szeretnél használni.

A fájlrendszert a belső flash memória, illetve egy SD-kártya támogatja, ha az be van helyezve.

VFS

A MicroPython egy Unix-szerű virtuális fájlrendszer (VFS) réteget valósít meg. Az összes csatolt fájlrendszer egyetlen virtuális fájlrendszerré egyesül, amely a / gyökérnél kezdődik. A fájlrendszerek ennek a struktúrának a könyvtáraiba kerülnek csatolásra, és induláskor a munkakönyvtár az elsődleges fájlrendszerre van beállítva.

Az OpenMV Cam esetében a belső flash a /flash útvonalon van csatolva, és ez a munkakönyvtár. Ha SD-kártya van behelyezve, az a /sdcard útvonalon kerül csatolásra, és ehelyett ez lesz a munkakönyvtár.

Blokkeszközök

A blokkeszköz egy olyan osztály példánya, amely megvalósítja a vfs.AbstractBlockDev protokollt.

Bekapcsoláskor az OpenMV Cam megpróbálja felismerni a belső flash (vagy SD-kártya) fájlrendszerét, majd automatikusan konfigurálni és csatolni azt. Ha nem található fájlrendszer, a teljes flash memóriát átfogó FAT fájlrendszer jön létre. A fedélzeti fájlrendszer törlésének vagy újraformázásának legegyszerűbb módja az OpenMV IDE vagy egy gyári visszaállítás; az alábbi alacsonyabb szintű Python API a haladó/programozott felhasználásra szolgál.

Belső flash

Az STM32 alapú OpenMV Camekben a pyb.Flash osztály biztosít hozzáférést a belső flashhez. Azokon a kártyákon, amelyek nagyobb külső flash memóriával rendelkeznek, ehelyett azt használja. A start kulcsszó-argumentumot mindig meg kell adni, azaz pyb.Flash(start=0).

Megjegyzés: A visszafelé kompatibilitás érdekében, amikor argumentumok nélkül hozod létre (azaz pyb.Flash()), csak az egyszerű blokk-interfészt valósítja meg, és az USB tömegtároláshoz bemutatott virtuális eszközt tükrözi (azaz az elején tartalmaz egy virtuális partíciós táblát).

Egyéni blokkeszközök

Saját blokkeszközt is létrehozhatsz Pythonban, és csatolhatod azt — például egy RAM lemezt. A következő osztály egy egyszerű blokkeszközt valósít meg, amely az adatait a RAM-ban tárolja egy bytearray használatával:

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

A következőképpen használható:

import vfs

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

A csatolás után a fájlrendszer ugyanúgy használható a Python kódból, ahogyan azt szokásosan tennéd, például:

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

Fájlrendszerek

Az OpenMV Cam a belső flasht FAT formátumúra formázza, hogy azokon a kártyákon, amelyek a fájlrendszert USB tömegtárolón keresztül elérhetővé teszik, a gazda PC külön illesztőprogramok nélkül tudja olvasni és írni.

A FAT nem tűri jól az írás közbeni áramkimaradást, ami a fájlrendszer sérüléséhez vezethet. A kamera kikapcsolása előtt a gazda gépen vedd ki/válaszd le a meghajtót, és a szkript által visszaírt adatokhoz inkább SD-kártyát használj a belső flash helyett.

Az STM32 alapú OpenMV Camekben a belső flash Pythonból újraformázható:

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