Tiedostojärjestelmien käyttö

Tämä opas kuvaa, miten OpenMV Cam tarjoaa laitteessa olevan tiedostojärjestelmän, jolloin pysyvän tallennustilan kanssa voi käyttää tavallisia Pythonin tiedosto-I/O-metodeja.

OpenMV Cam luo oletuskokoonpanon sekä tunnistaa ja liittää ensisijaisen tiedostojärjestelmän automaattisesti virran kytkeytyessä, joten tästä oppaasta on hyötyä lähinnä silloin, kun haluat osioida flash-muistin uudelleen, vaihtaa tiedostojärjestelmän tyyppiä tai käyttää mukautettua lohkolaitetta.

Tiedostojärjestelmä tukeutuu sisäiseen flash-muistiin tai SD-korttiin, kun sellainen on asennettu.

VFS

MicroPython toteuttaa Unix-tyylisen virtuaalisen tiedostojärjestelmän (VFS) kerroksen. Kaikki liitetyt tiedostojärjestelmät yhdistetään yhdeksi virtuaaliseksi tiedostojärjestelmäksi, joka alkaa juuresta /. Tiedostojärjestelmät liitetään tämän rakenteen hakemistoihin, ja käynnistyksessä työhakemistoksi asetetaan ensisijainen tiedostojärjestelmä.

OpenMV Camissa sisäinen flash-muisti liitetään polkuun /flash ja se on työhakemisto. Jos SD-kortti on asennettuna, se liitetään polkuun /sdcard ja siitä tulee työhakemisto sen sijaan.

Lohkolaitteet

Lohkolaite on sellaisen luokan ilmentymä, joka toteuttaa vfs.AbstractBlockDev -protokollan.

Virran kytkeytyessä OpenMV Cam yrittää tunnistaa tiedostojärjestelmän sisäisestä flash-muistista (tai SD-kortilta) sekä määrittää ja liittää sen automaattisesti. Jos tiedostojärjestelmää ei löydy, luodaan koko flash-muistin kattava FAT-tiedostojärjestelmä. Laitteen tiedostojärjestelmän tyhjentämiseen tai uudelleenalustamiseen helpoin tapa on OpenMV IDE tai tehdasasetusten palautus; alla oleva matalan tason Python-API on tarkoitettu edistyneeseen/ohjelmalliseen käyttöön.

Sisäinen flash-muisti

STM32-pohjaisissa OpenMV Cameissa pyb.Flash -luokka tarjoaa pääsyn sisäiseen flash-muistiin. Korteissa, joissa on suurempi ulkoinen flash-muisti, käytetään sitä sen sijaan. start-avainsana-argumentti tulisi aina määrittää, eli pyb.Flash(start=0).

Huomaa: Taaksepäin yhteensopivuuden vuoksi ilman argumentteja muodostettuna (eli pyb.Flash()) se toteuttaa vain yksinkertaisen lohkorajapinnan ja heijastaa USB-massamuistille esitettyä virtuaalilaitetta (eli se sisältää virtuaalisen osiotaulun alussa).

Mukautetut lohkolaitteet

Voit myös luoda oman lohkolaitteesi Pythonissa ja liittää sen — esimerkiksi RAM-levyn. Seuraava luokka toteuttaa yksinkertaisen lohkolaitteen, joka tallentaa tietonsa RAM-muistiin käyttäen bytearray-tyyppiä:

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

Sitä voidaan käyttää seuraavasti:

import vfs

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

Liittämisen jälkeen tiedostojärjestelmää voidaan käyttää normaaliin tapaan Python-koodista, esimerkiksi:

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

Tiedostojärjestelmät

OpenMV Cam alustaa sisäisen flash-muistin FAT -muotoon, jotta korteissa, jotka tarjoavat tiedostojärjestelmän USB-massamuistina, isäntä-PC voi lukea ja kirjoittaa sitä ilman ylimääräisiä ajureita.

FAT ei kestä virtakatkoa kirjoitusten aikana, mikä voi johtaa tiedostojärjestelmän vioittumiseen. Poista asema/irrota liitos isännässä ennen kameran sammuttamista, ja suosi SD-korttia sisäisen flash-muistin sijaan tiedoille, joita skripti kirjoittaa takaisin.

STM32-pohjaisissa OpenMV Cameissa sisäinen flash-muisti voidaan alustaa uudelleen Pythonista:

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