Dosya sistemleriyle çalışma

Bu öğretici, OpenMV Cam’in cihaz üzerinde bir dosya sistemini nasıl sağladığını ve standart Python dosya G/Ç yöntemlerinin kalıcı depolama ile nasıl kullanılabileceğini açıklar.

OpenMV Cam, açılışta varsayılan bir yapılandırma oluşturur ve birincil dosya sistemini otomatik olarak algılayıp bağlar; bu nedenle bu öğretici çoğunlukla flash belleği yeniden bölümlendirmek, dosya sistemi türünü değiştirmek veya özel bir blok aygıtı kullanmak istediğinizde işe yarar.

Dosya sistemi, dahili flash bellek tarafından veya takılı olduğunda bir SD kart tarafından desteklenir.

VFS

MicroPython, Unix benzeri bir Sanal Dosya Sistemi (VFS) katmanı uygular. Bağlanan tüm dosya sistemleri, kök dizin / ile başlayan tek bir sanal dosya sisteminde birleştirilir. Dosya sistemleri bu yapıdaki dizinlere bağlanır ve başlangıçta çalışma dizini birincil dosya sistemine ayarlanır.

OpenMV Cam’de dahili flash bellek /flash konumuna bağlanır ve çalışma dizinidir. Bir SD kart takılıysa /sdcard konumuna bağlanır ve bunun yerine çalışma dizini olur.

Blok aygıtları

Blok aygıtı, vfs.AbstractBlockDev protokolünü uygulayan bir sınıfın örneğidir.

Açılışta OpenMV Cam, dahili flash bellekteki (veya SD karttaki) dosya sistemini algılamaya, yapılandırmaya ve otomatik olarak bağlamaya çalışır. Hiçbir dosya sistemi bulunamazsa, tüm flash belleği kapsayan bir FAT dosya sistemi oluşturulur. Yerleşik dosya sistemini silmek veya yeniden biçimlendirmek için en kolay yol OpenMV IDE veya bir fabrika sıfırlaması kullanmaktır; aşağıdaki alt düzey Python API’si ileri düzey/programatik kullanım içindir.

Dahili flash bellek

STM32 tabanlı OpenMV Cam’lerde pyb.Flash sınıfı dahili flash belleğe erişim sağlar. Daha büyük harici flash belleğe sahip kartlarda bunun yerine onu kullanır. start kwarg’ı her zaman belirtilmelidir, yani pyb.Flash(start=0).

Not: Geriye dönük uyumluluk için, argümansız oluşturulduğunda (yani pyb.Flash()), yalnızca basit blok arayüzünü uygular ve USB yığın depolamaya sunulan sanal aygıtı yansıtır (yani başlangıçta sanal bir bölüm tablosu içerir).

Özel blok aygıtları

Python içinde kendi blok aygıtınızı oluşturup bağlayabilirsiniz — örneğin bir RAM diski. Aşağıdaki sınıf, verilerini bir bytearray kullanarak RAM’de saklayan basit bir blok aygıtı uygular:

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şağıdaki gibi kullanılabilir:

import vfs

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

Bir kez bağlandıktan sonra, dosya sistemi normalde Python kodundan kullanıldığı gibi kullanılabilir, örneğin:

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

Dosya sistemleri

OpenMV Cam, dahili flash belleği FAT olarak biçimlendirir; böylece dosya sistemini USB yığın depolama üzerinden sunan kartlarda, ana bilgisayar ek sürücü olmadan onu okuyup yazabilir.

FAT, yazma işlemleri sırasında güç kesintisine karşı toleranslı değildir ve bu da dosya sistemi bozulmasına yol açabilir. Kamerayı kapatmadan önce sürücüyü ana bilgisayarda çıkarın/ayırın ve betiğin geri yazdığı veriler için dahili flash bellek yerine bir SD kart tercih edin.

STM32 tabanlı OpenMV Cam’lerde dahili flash bellek Python’dan yeniden biçimlendirilebilir:

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