Práce se souborovými systémy

Tento návod popisuje, jak OpenMV Cam poskytuje souborový systém přímo v zařízení, což umožňuje používat standardní metody Pythonu pro práci se soubory (file I/O) s trvalým úložištěm.

OpenMV Cam při zapnutí vytvoří výchozí konfiguraci, automaticky detekuje a připojí primární souborový systém, takže tento návod je užitečný především tehdy, pokud chcete přerozdělit flash paměť, změnit typ souborového systému nebo použít vlastní blokové zařízení.

Souborový systém je uložen ve vnitřní flash paměti, případně na SD kartě, je-li nainstalována.

VFS

MicroPython implementuje vrstvu virtuálního souborového systému (VFS) podobnou tomu v Unixu. Všechny připojené souborové systémy jsou sloučeny do jednoho virtuálního souborového systému, který začíná v kořeni /. Souborové systémy se připojují do adresářů v této struktuře a při spuštění je pracovní adresář nastaven na primární souborový systém.

Na OpenMV Cam je vnitřní flash paměť připojena na /flash a je pracovním adresářem. Pokud je nainstalována SD karta, je připojena na /sdcard a stává se pracovním adresářem místo ní.

Bloková zařízení

Blokové zařízení je instance třídy, která implementuje protokol vfs.AbstractBlockDev.

Při zapnutí se OpenMV Cam pokusí detekovat souborový systém na vnitřní flash paměti (nebo SD kartě) a automaticky jej nakonfigurovat a připojit. Pokud žádný souborový systém není nalezen, vytvoří se souborový systém FAT zabírající celou flash paměť. Nejjednodušší cestou k vymazání nebo přeformátování vestavěného souborového systému je OpenMV IDE nebo tovární reset; nízkoúrovňové Python API níže je určeno pro pokročilé/programové použití.

Vnitřní flash paměť

Na OpenMV Cam založených na STM32 poskytuje přístup k vnitřní flash paměti třída pyb.Flash. Na deskách s větší externí flash pamětí se použije ta. Klíčový argument start by měl být vždy zadán, tj. pyb.Flash(start=0).

Poznámka: Z důvodu zpětné kompatibility, je-li vytvořena bez argumentů (tj. pyb.Flash()), implementuje pouze jednoduché blokové rozhraní a odráží virtuální zařízení prezentované jako USB mass storage (tj. zahrnuje virtuální tabulku oddílů na začátku).

Vlastní bloková zařízení

V Pythonu si také můžete vytvořit vlastní blokové zařízení a připojit jej — například RAM disk. Následující třída implementuje jednoduché blokové zařízení, které svá data ukládá do RAM pomocí 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

Lze ji použít následovně:

import vfs

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

Po připojení lze souborový systém používat tak, jak se běžně používá z kódu v Pythonu, například:

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

Souborové systémy

OpenMV Cam formátuje vnitřní flash paměť jako FAT, takže na deskách, které vystavují souborový systém přes USB mass storage, jej hostitelské PC dokáže číst i zapisovat bez nutnosti dalších ovladačů.

FAT není odolný vůči výpadku napájení během zápisu, což může vést k poškození souborového systému. Před vypnutím kamery vysuňte/odpojte disk na hostiteli a pro data, která skript zapisuje zpět, dejte přednost SD kartě před vnitřní flash pamětí.

Na OpenMV Cam založených na STM32 lze vnitřní flash paměť přeformátovat z Pythonu:

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