fatti aiutare
R2-D2-HUB-USB_2072.jpg
fatti aiutare
R2-D2-HUB-USB_2072.jpg
In realtà, come detto, basta implementare una qualche tecnica di wear-leveling per aumentare di gran lunga la durata delle EEPROM in questione.
Supponiamo di memorizzare i kWh impiegati in un numero in virgola fissa a 32 bit (ovvero, in un intero a 32 bit che invece di contare i kWh conta i decimi di kWh); ad ogni incremento una volta su 256 va a cambiare solo il byte meno significativo (in codifica big-endian), mentre tutti gli altri byte restano fermi dove stanno. D'altra parte, il contatore diventa inutilizzabile non appena una qualunque delle celle di memoria si rompe - cella che con ogni probabilità sarà quella usata per il byte meno significativo, visto che è sottoposta ad usura molto maggiore rispetto alle altre.
Possiamo riequilibrare la situazione sfruttando gli altri byte della EEPROM: se anche abbiamo solo 256 byte di EEPROM (come gli AVR scrausi impiegati negli Arduino), possiamo usare i primi 3 byte per memorizzare l'inizio del nostro contatore, e i restanti 253 a rotazione per il byte meno significativo (o qualcuno di meno se ci sono anche altri dati da memorizzare; l'importante è che i byte in questione siano meno di 256). Ad ogni nuova misura, i primi tre byte vengono riscritti solo se sono cambiati, mentre il quarto byte viene memorizzato a rotazione in una delle celle successive (come in un ring buffer).
Il puntatore alla posizione corrente del ring buffer può stare in memoria volatile, infatti al riavvio il contatore può individuare immediatamente la posizione a cui era arrivato: dato che le celle usate per il byte meno significativo sono meno di 256, basta individuare il punto del ring buffer in cui c'è una discontinuità nella numerazione (per questo è necessario che le celle siano meno di 256, altrimenti non sarebbe possibile individuare il punto in maniera univoca, o non individuarlo punto nel caso con n=256).
---
Si possono anche inventare schemi alternativi, forse anche migliori:
- se si può individuare con precisione quando una cella di EEPROM è morta (si può fare una verifica rapida provando a rileggere i dati appena scritti e vedere se coincidono, ma verificare se la cella è in grado di mantenere i dati a lungo non alimentata è molto più complesso), si può impostare uno schema di rilocazione, un po' come fanno i dischi fissi con i settori danneggiati; i primi 4 byte della EEPROM fungono da puntatori alle celle di memoria da impiegare per i 4 byte dell'intero da memorizzare; quando il programma vede che una cella è morta, individua la successiva cella libera (basta prendere il max+1 dei byte-puntatori), scrive lì il dato e aggiorna il byte-puntatore perché punti alla nuova cella;
- altrimenti, ci si può fidare delle specifiche del costruttore; il primo byte della EEPROM farà da puntatore per la posizione in cui viene memorizzato il byte meno significativo (ovvero quello più soggetto ad usura); ogni 100'000/1'000'000/quelcheè di scritture (numero che già abbiamo, visto che corrisponde al numero memorizzato in memoria) il programma passa ad usare un altro byte della EEPROM, memorizzandone la posizione nel primo byte.
A tutto questo si può aggiungere quel che dicevo prima - ovvero, scrivere effettivamente i dati solo quando se ne va la corrente; esistono diversi metodi per rilevare rapidamente la caduta di tensione sul circuito di alimentazione, mantenendo alimentato il microcontrollore con un condensatore o una batteria tampone giusto per il tempo necessario per scrivere i dati in EEPROM. A questo punto, il numero di scritture in EEPROM diventa estremamente ridotto (1 per ogni volta che viene tagliata l'alimentazione, più eventualmente una ogni tanto per sicurezza), e il problema di usura delle celle risulta trascurabile.
Amaro C++, il gusto pieno dell'undefined behavior.
non caso hanno inventato una serie televisiva dedicata a te![]()
La cosa buffa è che, pur sentendo parlare delle gesta di McGyver da anni, non credo di averne mai visto una puntata completa.![]()
Amaro C++, il gusto pieno dell'undefined behavior.
ok, mi sono fatto un cultura sulla eeprom.
che, se ho capito bene, registra i dati (in sostanza) in un transistor.
ma che accade al transistor? cosa cambia in lui per far si che si "ricordi"?
ho capito bene o ho detto una castronata?
Disclaimer: di transistor non ne so niente, al 90% ci saranno grosse imprecisioni e/o cavolate cosmiche in quello che vado a scrivere
L'idea è di questo tipo.
La conduttività di un semiconduttore può essere influenzata tramite un campo elettrico esterno - detta alla brutto schifo, se applico un campo elettrico esterno, è più facile per degli elettroni attraversare un semiconduttore; questa roba si chiama "effetto di campo".
Sulla base di questo principio lavorano i FET (transistor ad effetto di campo): source e drain sono collegate tramite un semiconduttore, che è influenzato dal campo elettrico generato dal gate. Il potenziale applicato al gate è in grado quindi di modulare la corrente che passa tra gli altri due terminali. Nella configurazione che ci interessa, il FET è costruito in modo tale da avere una tensione di soglia, tale per cui la corrente viene lasciata passare solo se la differenza di potenziale tra gate e source supera un certo valore.
Dato che in un FET l'influenza del gate avviene solo tramite il campo elettrico generato dalle cariche che si trovano su esso, non c'è connessione diretta tra il gate e gli altri due terminali. Per questo motivo, è possibile costruire un FET con gate completamente isolato e lasciato "floating", ovvero normalmente non connesso direttamente ad alcun elemento circuitale (=non c'è passaggio diretto di portatori di carica tra gate e gli altri terminali); della carica depositata sul floating gate può persistere per anni, dato che è circondata da materiale isolante.
Se ora sovrapponiamo al floating gate uno strato di materiale isolante e un altro conduttore (il control gate) otteniamo una situazione analoga a quella della figura di destra:
Il floating gate è completamente isolato, ma si comporta da condensatore rispetto al control gate e al substrato di semiconduttore. Ora, fissata una certa differenza di potenziale sul CG, l'influenza del campo generato dal gate sul substrato (e quindi la caratteristica V-I del transistor) dipende dalla eventuale carica intrappolata sul FG.
In pratica, si può calcolare che la tensione di soglia CG-source del FET a FG così realizzato ha una dipendenza importante dalla quantità di carica (Q) intrappolata sul FG.
Per questo motivo, applicando sul CG una tensione superiore alla "soglia bassa" (relativa al caso con Q=0) ma inferiore alla soglia alta (relativa ad una qualche Q≠0 caratteristica del dispositivo), è possibile determinare immediatamente se c'è carica intrappolata sul floating gate, senza andarlo a disturbare in alcuna maniera: se tra source e drain passa corrente, allora Q=0, altrimenti Q≠0.
Le memorie EPROM ed EEPROM "nascono" con Q=0 su tutti i FG (normalmente corrispondente ad un "1" logico); per caricare i FG (e quindi impostarli ad uno "0" logico), è necessario applicare sul CG una tensione superiore alla normale tensione operativa: questo genera un effetto (hot-carrier injection) che consente di superare la barriera di potenziale dello strato di dielettrico che divide CG da FG, e quindi di caricare il FG. Rimossa questa tensione, la carica che è arrivata sul CG rimane intrappolata, e il bit è così programmato sullo stato "0".
Nelle memorie EPROM non vi è la possibilità di cancellare i dati elettronicamente, ma sui chip c'è un'apposita finestra in quarzo per esporre il circuito ai raggi ultravioletti; i fotoni dei raggi ultravioletti ionizzano il dielettrico che isola il FG, e consentono così la dissipazione delle cariche intrappolate su tutti i FG del chip.
L'evoluzione delle memorie EPROM sono le EEPROM, che consentono di cancellare individualmente ed elettronicamente le varie celle di memoria. Per programmare la cella di una EEPROM da quel che ho capito il concetto è simile, mentre per cancellarla (=reimpostare Q=0) le cariche intrappolate vengono estratte sfruttando il tunneling di Fowler–Nordheim (il tunneling è un effetto quantistico tale per cui una particella è in grado di attraversare una barriera di potenziale anche senza possedere l'energia che classicamente sarebbe necessaria per superarla); da quel poco che ci ho capito, anche in questo caso l'idea di fondo è applicare un campo elettrico intenso, che dovrebbe creare le condizioni favorevoli per il tunneling e consentire così la "fuga" degli elettroni intrappolati.
Ultima modifica di MItaly; 28-11-2013 a 19:24
Amaro C++, il gusto pieno dell'undefined behavior.
quindi, riassumendo brutalmente, si può dire che il floating gate (che è quello che in realtà conserva l'informazione, se ho capito giusto) passa da una carica elettrica ad un'altra ed è questa che stabilisce quale informazione conserva?
sai... devo spiegarlo "a mia nonna": bisogna che sia semplice e conciso