Gestire un file system – Parte 3

Sul blog di Elettronica Open Source puoi leggere non solo tutti gli articoli Premium riservati agli abbonati Platinum 2.0 e inseriti nella rivista Firmware 2.0 (insieme ad articoli tecnici, progetti, approfondimenti sulle tecnologie emergenti, news, tutorial a puntate, e molto altro) ma anche gli articoli della Rubrica Firmware Reload. In questa Rubrica del blog abbiamo raccolto gli articoli tecnici della vecchia rivista cartacea Firmware, che contengono argomenti e temi evergreen per Professionisti, Makers, Hobbisti e Appassionati di elettronica. La libreria Microchip MDD (Memory Disk Drive) permette di trasferire e condividere i dispositivi di memoria portatili tra un sistema embedded e un personal computer, fornendo le funzioni di I/O in grado di leggere e/o scrivere su questi dispositivi di memoria tramite un microcontrollore.

LE DIRECTORY

Ad eccezione di quella root, tutte le directory del file system sono scritte come se fossero comuni file. Ciascuna directory occuperà quindi uno o più cluster nell’area dati della partizione, e avrà una sua entry nella catena dei cluster della FAT. Il bit 4 del campo "File Attributes" nella root directory permette di distinguere una directory da un comune file: se il bit vale 1, significa che quell’entry appartiene proprio a una directory. I nomi delle directory, come quelli di tutti i file, seguono il classico formato ‘8.3’: 8 caratteri per il nome e 3 caratteri per l’estensione; a differenza dei file, tuttavia, le directory non hanno un’estensione. Tutte le directory (a eccezione della root) posseggono sempre due entry: la directory "punto" (dot, o ‘.’), e la directory "punto punto" (dot dot, o ‘..’). La directory "punto" è la prima entry in ogni sub directory e il suo nome inizia con il carattere punto (2Eh) seguito da dieci caratteri di spazio (20h). Il puntatore al primo cluster di questa entry punta al cluster che contiene l’entry stessa. La directory "punto punto" è analoga, con il nome composto da due caratteri punto seguiti da nove spazi e il puntatore al primo cluster punta alla directory che contiene l’entry relativa alla directory "punto". La gestione delle directory è opzionale nel file system MDD: se questa viene abilitata, tutte le modifiche a un certo file verranno eseguite nella Current Working Directory (CWD); la CWD viene inizialmente impostata alla root directory quando il file system viene inizializzato tramite la chiamata alla procedura FSInit, e può successivamente essere cambiata tramite una chiamata alla procedura FSchdir. Si noti come la sintassi da seguire per i nomi delle directory è la stessa utilizzata dal sistema operativo MD-DOS; nel definire un percorso all’interno di codice C, occorre ricordarsi di inserire un doppio slash, in quanto lo slash singolo verrebbe interpretato dal compilatore come una sequenza di escape.

LE API DELLA LIBRERIA

La libreria MDD di Microchip si basa su un insieme completo di procedure (API), invocabili all’interno del codice utente, per la gestione dei file e dell’unità di memoria. La lista delle API disponibili è la seguente (per una descrizione delle stesse si rimanda all’AN1045 o all’help fornito con la libreria): FSInit, FSfclose, FSfeof, FSfopen, FSfopenpgm, FSfread, FSfseek, FSftell, FSfwrite, FSremove, FSremovepgm, FSrename, FSrewind, FSmkdir, FSchdir, FSrmdir, FSgetcwd, FindFirst, FindFirstpgm, FindNext, FSformat, FSfprintf, SetClockVars.

PERSONALIZZAZIONE DELLA LIBRERIA

L’importante valore aggiunto di questa libreria è la possibilità di essere configurata, agendo su alcune "define" presenti nel codice e impostando opportunamente alcune costanti secondo le esigenze della specifica applicazione. Il codice sorgente messo a disposizione da Microchip, inoltre, è ben strutturato e graziosamente commentato, rendendo questo compito agevole anche per chi ha meno esperienza a livello di programmazione. Prima di compilare la libreria e generare un progetto, si consiglia di seguire i passi seguenti:

  1. selezionate l’opportuno livello fisico per l’interfacciamento della scheda di memoria: modo SPI per le schede SD (file SD-SPI.c e SD-SPI.h) oppure modulo PMP per le Compact Flash (file CF-PMP.c e CF-PMP.h) o, infine, commutazione manuale dei bit (file CF-Bit transaction.c, e CF-Bit transaction.h). Il livello fisico viene selezionato includendo in FSconfig.h uno dei file precedentemente menzionati;
  2. definite la frequenza di clock del sistema nel file FSconfig.h;
  3. se intendete utilizzare della memoria statica per i file, dovrete specificare il massimo numero di file che possono essere contemporaneamente aperti in FSconfig.h;
  4. se usate la modalità di interfacciamento SPI, dovrete indicare il nome dei registri interessati nel file SD-SPI.h. Per esempio, se usate il modulo SPI 1 su un PIC24, dovrete cambiare la definizione di SPI1CON in SPI1CON1. Se impiegate il modulo 2, dovrete cambiare la definizione in SPI2CON1;
  5. se usate un PIC18 dovrete modificare il file del linker in modo tale da includere una sezione di RAM da 512 byte con funzione di buffer di lettura/scrittura. Questo buffer va definito all’inizio del file relativo all’interfaccia fisica;
  6. se intendete utilizzare la memoria dinamica per allocare oggetti, dovrete abilitare le corrispondenti direttive per il preprocessore nel file FSconfig.h;
  7. impostate i percorsi per le librerie e i file include (e per il linker nel caso di PIC18) nell’apposita scheda del comando Build;
  8. impostate i segnali di ingresso/uscita richiesti dall’interfaccia a livello fisico (SD-SPI.h, CF-PMP.h ecc.);
  9. accertatevi che tutti i pin utilizzati siano configurati come segnali di I/O digitali;
  10. selezionate il device opportuno (PIC18, PIC24F, PIC24H, dsPIC30 o dsPIC33);
  11. nel file FSconfig.h sono presenti diverse opzioni (normalmente commentate per risparmiare memoria): se volete abilitare la corrispondente funzionalità, dovrete scommentarle
  12. scommentate la define corrispondente alla modalità di clock utilizzata per il timestamp dei file (data di creazione, modifica o ultimo accesso a ogni singolo file).

Le opzioni a cui si è fatto riferimento nel precedente punto 11 sono le seguenti:

  • ALLOW_WRITES: abilita la funzionalità di scrittura sul file system. Per talune applicazioni può essere sensato montare il file system in solo lettura (si pensi a un’applicazione di sintesi vocale);
  • ALLOW_DIRS: abilita la gestione delle directory (richiede che sia abilitata anche ALLOW_WRITES);
  • ALLOW_FORMATS: abilita la funzionalità di formattazione della scheda di memoria;
  • ALLOW_FILESEARCH: abilita le funzioni di ricerca dei file e delle directory, come ad esempio FindFirst and FindNext;
  • ALLOW_PGMFUNCTIONS: abilita le funzioni pgm, come ad esempio FSfopenpgm, FSremovepgm, e così via (solo per il PIC18). Queste funzioni accettano parametri passati attraverso la ROM;
  • ALLOW_FSFPRINTF: abilita la funzione FSfprintf;
  • SUPPORT_FAT32: abilita il file system FAT32.

PERFORMANCE

Nella tabella di Figura 1 è mostrato l’utilizzo di memoria per la libreria con interfaccia di tipo SD-SPI. 512 byte sono richiesti per il buffer dati e altri 512 byte sono utilizzati dal buffer per la file allocation table. Memoria addizionale può essere richiesta in base al numero di file aperti (il default corrisponde a due file aperti con allocazione della memoria statica).

Figura 8: utilizzo della memoria.

Figura 1: Utilizzo della memoria

HARDWARE OPZIONALE

Le schede opzionali di valutazione sono due: la daughter card PICtail Plus® SD & MMC (AC164122) [3], e la daughter card USB PICtail Plus (AC164131) [4].

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend