Avr/eeprom indirizzi locazioni

Ciao, sto realizzando un progetto con Arduino Mega, nel quale ho le necessità di memorizzare una cinquantina di dati di vario tipo (principalmente int e float).
Leggendo nel forum ho visto che inclusa nell'Ide c'e la libreria avr/eeprom, che consente di leggere e scrivere dati direttamente del tipo voluto... ma non ho trovato molti esempi.
La domande sono queste:

  • le funzioni di read e write puntano ad indirizzo assoluto ed univoco, oppure devo dichiarare e dimensionare aree specifiche per ogni tipo?
  • l'indirizzo che metto è a byte (per esempio se leggo delle float che occupano 4 byte ciascuna, devo puntare al primo byte dei 4, quindi 0...4...8...etc)?
    Grazie.

I puristi mi insulteranno...
Ma oltre a read e write ci sono anche i metodi get e put
https://www.arduino.cc/en/Reference/EEPROMPut

Perché, i due metodi elencati sono molto pratici e usano internamente l'updat eche verifica se il dato è effettivamente da agigornare prima di scriverlo per risparmiare cicli di scrittura (punto critico per la EEPROM) quindi bene usarli soprattutto per chi, alle prime esperienze, non vuole complicarsi la vita

fabpolli:
bene usarli soprattutto per chi, alle prime esperienze, non vuole complicarsi la vita

Concordo pienamente!
I puristi evidentemente hanno tempo da perdere :o

i "puristi" solitamente sono molto esperti e sanno che ottimizzare codice e risorse è fondamentale, sempre, ma tanto più quando si lavora con dispositivi con poche risorse.
Poi come va dicendo spesso Guglielmo molte ottimizzazioni forzate non servono a nulla in quanto il compilatore è molto più furbo di quanto non ci si aspetta e ci pensa lui a fare le cose "al meglio".
Poi se per un progetto che legge la EEPROM all'inizio la scrive una volta ogni morte di papa e non fa compiti particolarmente complessi andare a cercare il metodo più efficace in assoluto si rischia in effetti di perdere tempo inutilmente.

Si ma in questo caso non ha proprio alcun senso perché put() e get() sono due metodi già estremamente ottimizzati...

EEPROM.h

dormouse75:
… Leggendo nel forum ho visto che inclusa nell’Ide c’e la libreria avr/eeprom, che consente di leggere e scrivere dati direttamente del tipo voluto… ma non ho trovato molti esempi.

… è la cosa migliore da utilizzare (… che è ciò su cui poi si basano TUTTE le librerie che trovi in giro) ;D

Studiati il documento allegato, specie il capitolo 6 e … ti sarà tutto più chiaro … :wink:

Guglielmo

EEPROM.pdf (181 KB)

Ok grazie!

approfitto della vostra esperienza: può capitare su Arduino che i dati contenuti sulla EEprom, per qualche guasto o evento particolare, si corrompano, assumendo valori diversi?
Ve lo chiedo perchè devo salvarci dei parametri di protezione batterie al litio…

si corrompano, assumendo valori diversi?

E' improbabile, ma non impossibile. Se vuoi essere (ragionevolmente) certo che i dati letti siano quelli salvati in precedenza devi usare un cheksum, da scrivere anch'esso sulla eeprom.

Ciao, Ale.

ilguargua:
E' improbabile, ma non impossibile.

Esatto ...
... nel datasheet è chiaramente scritto che, se durante le operazioni di scrittura (che sono relativamnete lente), capita qualche cosa di anomalo (... tipicamente un calo di tensione), i dati nella EEPROM possono essere corrotti. Non per nulla, la sezione 8.4.2 del datasheet del ATmega328P è titolata "Preventing EEPROM Corruption" :wink:

Aggiungere un checksum, come suggerito, al blocco di dati scritti è sempre buona cosa :slight_smile:

Guglielmo

A me è successo... Non ho mai capito cosa sia successo di preciso, ma mi sono trovato con tutti i valori salvati in eeprom corrotti... E sono sicuro al 99% che è dipeso da un evento esterno allo sketch

Adesso che ho letto la risposta di Guglielmo forse ho capito il perché...