Emulazione di EEPROM in modalità Fuss-Free

I requisiti per un data storage di dimensioni piccolo-medie tendono ad aumentare in varie applicazioni quando i progettisti hanno bisogno di uno storage non-volatile per variabili che cambiano poco frequentemente, come ad esempio parametri di calibrazione, impostazioni di configurazione o logging di dati e/o eventi. La soluzione più comune a questo problema è l'utilizzo di una EEPROM, collegata attraverso un'interfaccia seriale al microntrollore. Questa soluzione risulta essere compatta, robusta, flessibile, facile da implementare ed economica.

Alcuni microcontrollori, ovviamente, offrono delle EEPROM dati on-chip, che offrono prestazioni migliori in termini di velocità (accesso parallelo alla memoria) e lasciano liberi due o tre pin. Per contro, il maggior numero di passi necessari alla produzione di una EEPROM integrata nel microcontrollore influenza il prezzo finale dello stesso, ed offre all'utente una limitata flessibilità per quanto riguarda la dimensione delle memorie disponibili. Anche se un microntrollore fosse disponibile con tutti i requisiti necessari per l'applicazione, quando il progettista necessita di modificare il range di lavoro dello stesso, le possibilità di utilizzare le EEPROM on-chip sono ristrette.

Emulazione delle funzionalità EEPROM

Una soluzione alternativa utilizza la memoria FLASH del microntrollore per emulare il funzionamento dello storage dati della EEPROM. Questa tecnica richiede un driver software parecchio più complesso, ma fornisce flessibilità per quanto riguanda la dimensione della memoria a costi zero, assumendo che esista una FLASH on-chip aggiuntiva. Fino a poco tempo fa, l'adozione di questo approccio è sempre stata limitata, poichè molti controller soffrono delle debolezze fondamentali nelle loro architetture, o di ridotta dimensione della FLASH, retenzione dati, cicli write-erase, sistemi di page banking, restrizioni per quanto riguarda l'alimentazione durante la configurazione, oppure della necessità di operare dalla RAM durante la scrittura su FLASH, fatto che può compromettere la sicurezza dell'applicazione in caso di interruzione dell'alimentazione.

Individualmente, nessuna delle precedenti debolezze risulta essere un problema insormontabile, ma collettivamente, aggiungono risorse per quanto riguarda prezzo, time-to-market e praticità. L'utilizzo di hardware dedicato on-chip non è la soluzione corretta, poichè questo approccio continua a limitare l'utente ad un numero ridotto di opzioni all'interno di una data famiglia di controllori.

Per trovare una soluzione, è necessario andare a verificare le differenze tra le EEPROM seriali off-chip e le memorie FLASH on-chip, e tra le architetture e le caratteristiche funzionali fornite dall'ultima generazione di microcontrollori.

EEPROM è progettata per lo storage dati, e supporta l'indirizzamento dei byte ad accesso casuale, con funzioni di scrittura e cancellazione integrate in un solo passo per semplicità. La velocità non è solitamente un problema, ma le modalità page o line supportano solitamente la scrittura di 16 o 32 bytes per volta per salvare le configurazioni di sistema in caso di spegnimento. La robustezza è molto importante, nel caso ad esempio sia necessario eseguire da centinaia di migliaia fino ad un milione di cicli write-erase, per decine di anni di storage dati.

La FLASH on-chip, d'altro canto, è ottimizzata per l'esecuzione di programmi ad elevate prestazioni. Questo richiede non solo accessi casuali rapidi, ma, cosa più importante, un bus dati ultra-wide e predisposizioni per l'utilizzo in burst mode, come ad esempio accelerazione della memoria. Questi aspetti non sono solitamente così importanti quando si sceglie una EEPROM. Possono esserci dei vantaggi; per programmazione ad alta velocità, gli array FLASH supportano cancellazione di massa e di pagina, portando alcuni vantaggi quando si parla di storage dati.

Emulazione di EEPROM in modalità Fuss-Free - Sacrifici

In ogni caso, per fornire delle FLASH on-chip ad alte performance e basso costo, alcune caratteristiche devono essere sacrificate. Poichè il codice solitamente non necessita di essere aggiornato così frequentemente come i dati non volatili, il numero di cicli write-erase è solitamente di magnitudo inferiore rispetto ad una EEPROM esterna. Un'altra differenza importante è che una volta che i dati sono stati ricevuti ed il ciclo di scrittura è stato attivato, una EEPROM esterna si prende cura di completare il processo, sempre che la sua alimentazione rimanga stabile, mentre la FLASH on-chip richiede supporto continuo dalla CPU.

Differenze Prevalenti

Una soluzione soddisfacente al problema deve bilanciare le differenze filosofiche tra le memorie ottimizzate per codice e per dati. Questo risultato può essere ottenuto utilizzando una combinazione della moderna progettazione di microcontrollori con driver sofware pratici.

Una delle tecniche più utilizzate, è quella di aggiungere un tag, o indirizzo virtuale, durante la memorizzazione di ciascun byte di dati, ed utilizzare successivamente molteplici settori della FLASH per estendere il numero effettivo di cicli write-erase.

Facendo in questo modo però si ottiene che un aumento della memoria richiesta per memorizzare i dati dell'applicazione, ma questo effetto collaterale viene bilanciato sia dal costo per bit inferiore delle FLASH, sia dalla minore dimensione per settore dei moderni microcontrollori. Un'implementazione molto semplice utilizza due pagine di memoria FLASH, ma questa implementazione può essere estesa facilmente se richiesto.

Una pagina viene gradualmente riempita procedendo byte-per-byte, mentre la seconda pagina viene preparata per proseguire nella scrittura quando la prima risulta piena. Per tenere traccia del processo, ogni pagina possiede un campo di intestazione che include lo stato corrente, indica se la pagina è vuota, se si trova nel processo di riempimento o se è piena. Quando l'applicazione ha bisogno di immagazzinare variabili nella EEPROM emulata, ogni variabile, assieme al suo indirizzo virtuale, viene scritta nella successiva porzione di pagina libera della pagina corrente. Questa logica viene applicata anche quando la variabile viene riscritta - il valore precedente non viene sovrascritto, ma invece il nuovo valore viene scritto nella successiva posizione disponibile.

Se l'applicazione deve leggere la variabile, viene ricercata la versione più recente di quelle variabile all'interno della pagina. Quando la pagina corrente è piena, viene eseguito un processo di "garbage collection", ed i valori più recenti di ogni variabile vengono copiati in una nuova pagina. La vecchia pagina può quindi venire cancellata. Con l'approccio convenzionale di memorizzare ogni variabile in un indirizzo fisso, la capacità di write-erase dell'intera periferica è definita dalla variabile che cambia più frequentemente.

L'approccio che utilizza il tagging distribuisce il carico in maniera equilibrata nelle pagine FLASH, alzando così la soglia di resistenza al carico effettiva. Per applicazioni in cui una piccola quantità delle variabili cambia abbastanza regolarmente, è possibile ottenere un miglioramento nell'ordine di magnitudo, portando le perfomance fino ai livelli attesi da una EEPROM.

Storicamente, prima non era possibile eseguire del codice da un banco di FLASH mentre si effettuava la programmazione dello stesso banco. Quando il costo del sistema diventa un fattore importante, non è possibile considerare l'opzione di utilizzare banchi FLASH multipli; allo stesso modo nei vecchi microcontrollori, era necessario effettuare l'esecuzione da RAM quando si riprogrammava la FLASH. I microcontrollori di oggi non utilizzano banchi flash, ma optano invece per per l'incapsulamento del supporto di scrittura e lettura in parallelo da ed a un array FLASH uniforme.

La gestione dell'alimentazione è molto importante. È preferibile utilizzare una tensione di alimentazione singola per evitare di dover effettuare lo switching ed il monitoring delle tensioni di programmazione durante l'esecuzione. I nuovi microcontrollori devono essere in grado di riprogrammare i loro array FLASH ad entrambi gli estremi del range di alimentazione, cosa che i precedenti design a basso voltaggio non erano in grado di fare.

Esempio di emulazione di EEPROM FLASH-based con Wear-Levelling (16-bit data)
Esempio di emulazione di EEPROM FLASH-based con Wear-Levelling (16-bit data)

È necessario utilizzare inoltre un rilevatore di tensione ausiliario flessibile ed accurato per avvertire la CPU nel caso stia per verificarsi un power down imminente, in modo da avere abbastanza tempo per salvare i dati critici prima dello spegnimento.

Nel caso di una perdita di potenza durante la programmazione, sia con FLASH che con EEPROM, è possibile che i dati o le pagine risultino corrotte. Per poter recuperare la situazione dopo l'incidente, l'header delle pagine deve essere controllato immediatamente dopo il riavvio. In qualsiasi momento, solo una pagina deve risultare "valida", ed in questo caso il software può decidere di affidarsi a questi valori se esiste qualche sospetto che l'altra pagina sia stata corrotta. Se nessuna delle pagine risulta "valida", in questo caso è stato corrotto qualcosa, entrambe le pagine dovrebbero essere cancellate ed i parametri dell'applicazione dovrebbero essere reimpostati ai valori di default. Livelli di stato addizionali, come anche software locking e handshaking possono essere aggiunti nel caso l'applicazione richieda un livello di sicurezza maggiore.

Conclusioni

È sempre stato possibile emulare una EEPROM, ma solo con le caratteristiche dei microcontrollori delle generazioni attuali, come l'STM32, che questa soluzione diviene robusta e priva di problemi. Accoppiando la corretta famiglia di microcontrollori con un adeguato driver software, l'ingegnere progettista può implementare un'emulazione EEPROM efficiente e flessibile, riducendo così la quantità di componenti ed il costo del sistema.

Farnell

 

Fonte: Technology First.

Scarica subito una copia gratis
Tags:

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend