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')