classe Flash – accesso alla memoria flash integrata

La classe Flash consente l’accesso diretto al dispositivo flash primario sulle OpenMV Cam basate su STM32.

Nella maggior parte dei casi, per memorizzare dati persistenti sul dispositivo, conviene usare un’astrazione di livello superiore, per esempio il filesystem tramite l’API standard dei file di Python, ma questa interfaccia è utile per personalizzare la configurazione del filesystem o implementare un sistema di archiviazione di basso livello per la propria applicazione.

Nota

Le OpenMV Cam H7 Plus, Pure Thermal ed N6 usano un chip flash SPI/QSPI/XSPI esterno come archiviazione primaria; le altre OpenMV Cam basate su STM32 usano la flash interna all’interno della MCU. L’interfaccia Python è identica in entrambi i casi.

Costruttori

class pyb.Flash
class pyb.Flash(*, start: int = -1, len: int = -1)

Costruisce un block device compatibile con vfs.AbstractBlockDev per la flash integrata. Esistono due forme:

  • Flash() (senza argomenti): restituisce l’oggetto singleton legacy che espone l’intera flash con una tabella di partizioni virtuale anteposta. I dati flash effettivi iniziano al blocco 0x100. Questa forma è deprecata e verrà rimossa in una futura release di MicroPython.

  • Flash(start=..., len=...): restituisce un nuovo block device che accede alla flash a partire dall’offset in byte start (predefinito 0) per len byte (predefinito: il resto del dispositivo). Entrambi i valori devono essere multipli della dimensione di blocco sottostante (tipicamente 512 byte per la flash interna; le parti SPI/QSPI/XSPI esterne usano una dimensione di settore di cancellazione più grande).

Metodi

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

Legge byte dalla flash in buf. Due overload espongono l’interfaccia semplice ed estesa:

Forma semplice (readblocks(block_num, buf)): legge blocchi interi a partire dall’indice di blocco block_num. len(buf) deve essere un multiplo della dimensione di blocco della flash.

Forma estesa (readblocks(block_num, buf, offset)): legge len(buf) byte – non necessariamente un numero intero di blocchi – a partire dal byte offset all’interno del blocco block_num. len(buf) non ha vincoli di allineamento. Supportata solo sugli oggetti creati con argomenti start / len espliciti, non sul singleton deprecato.

writeblocks(block_num: int, buf: bytes | bytearray) None
writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None

Scrive byte da buf nella flash. Due overload espongono l’interfaccia semplice ed estesa:

Forma semplice (writeblocks(block_num, buf)): scrive blocchi interi a partire dall’indice di blocco block_num. len(buf) deve essere un multiplo della dimensione di blocco della flash. Ogni blocco interessato viene cancellato automaticamente prima di essere scritto.

Forma estesa (writeblocks(block_num, buf, offset)): scrive len(buf) byte – non necessariamente un numero intero di blocchi – a partire dal byte offset all’interno del blocco block_num. len(buf) non ha vincoli di allineamento e non viene eseguita alcuna cancellazione implicita – il chiamante deve assicurarsi che i blocchi interessati siano stati cancellati tramite una precedente chiamata a ioctl(6, block_num). Supportata solo sugli oggetti creati con argomenti start / len espliciti.

ioctl(cmd: int, arg: int) int | None

Punto di ingresso ioctl standard di vfs.AbstractBlockDev. Vedere vfs.AbstractBlockDev.ioctl() per l’elenco completo dei valori di cmd. cmd=5 restituisce la dimensione di blocco della flash in byte; cmd=6 cancella il blocco con indice arg.