Fonction EEprom.update()

Bonjours,

Après de multiples recherches sur le net au sujet de la fonction EEprom.update(), ma question est, si j'ai bien retenu les explications de divers blogs!, en remplaçant EEprom.write() par EEprom.update(), l'écriture de celle-ci se fera que quand la valeur désirée change et non toutes les 3,3 ms au nombre de 100'000 cycles maximum soit 330 minutes de durée de vie de l'eeprom si aucun delay() n'y ait ajouté dans le code. Par contre avec eeprom.update(), la durée de vie serait nettement supérieur du faite que l'écriture se fera qu'au moment d'un changement, ce qui laisserait la possibilité de changer 100'000 fois de valeur avant de détruire celle-ci?

Merci à celui qui pourrait confirmer ma question...

exactement :-)

en fait la lecture de l'EEPROM ne l'use pas donc la fonction update va lire la valeur qui est stockée et si c'est déjà celle que vous voulez alors elle n'écrit rien. c'est juste plus lent s'il faut écrire car vous avez une lecture en plus

en gros EEPROM.update(address, val); c'est la même chose que de faire

if( EEPROM.read(address) != val ){
  EEPROM.write(address, val);
}

comme proposé dans ton post précédent

from: Condecta on Sep 22, 2016, 06:51 pm

Et pour la fonction eeprom vous suggérez de supprimer les delay?

utiliser EEPROM.update() (au lieu de write) qui n’écrit que si la valeur change

Merci pour la confirmation, j'ai déjà détruit 2 cartes UNO avant de savoir l'astuce EEprom.update()!. Au faite, quand les 100'000 cycles de la mémoires eeprom sont arrivés à terme, celle-ci deviens inutilisable mais la mémoires flasch où est stockée le programme d'execution n'ait pas affectée par contre? La carte est-elle toujours utilisable sans mémoire morte, donc en l'absence de l'alimentation toutes les données seront annulées? à part le programme principale téléversé dans la flasch?

oui, le reste demeure utilisable, même en théorie c'est seulement le bout de l'EEPROM où t'as écrit 100'000 fois qui devient inutilisable mais le reste de l'EEPROM demeure utilisable. Lorsque tu fais des écritures régulières sur l'EEPROM il vaut donc mieux le faire de façon "circulaire", c'est à dire en écrivant à chaque fois sur un nouvel "emplacement" (adresse) de ton EEPROM, ca peut être un peu fastidieux à coder, mais ca rallonge énormément la durée de vie de ton EEPROM car tu "l'uses" de manière homogène. Pour info c'est ce genre d'algorithmes qu'il y a aussi dans tes clés USB qui sont aussi des EEPROM, pour les "user" de manière uniforme. En tant qu'utilisateur tu ne le vois pas mais le driver bas niveau fait ce travail. ;)

De manière plus générale la mémoire flash (que l'on trouve dans les stick USB ou pour la partie programme de votre arduino) est un type d'EEPROM qui permet la modification de plusieurs espaces mémoires en une seule opération. La mémoire flash est donc plus rapide lorsque le système doit écrire à plusieurs endroits en même temps.

L'écriture des données dans une mémoire Flash s'effectue par l'application de différentes tensions aux points d'entrée de la cellule. Ces opérations soumettent la grille à rude épreuve et On estime qu'une mémoire flash peut supporter jusqu'à 100 000 cycles de écritures / effacements, selon la qualité de l'oxyde utilisé pour la grille.

Ce que mentionne Zorro sur l'écriture à différents endroits pour ne pas user prématurément une case mémoire est pris en compte quand il y a un système d'exploitation: Il existe des systèmes de fichiers spécialement conçus pour la mémoire flash (cf JFFS, JFFS2, YAFFS et autres UBIFS) qui permettent d'éviter la réécriture répétée sur une même zone afin de prolonger la durée de vie de la mémoire flash. Ces systèmes de fichiers sont aussi capables de détecter des zones "mortes" et de plus aller écrire dedans. votre clé USB a alors moins de mémoire à l'origine mais reste fonctionnelle.

Sur arduino on n'a pas ce niveau de gestion (pas d'OS, pas de contrôleur qui ferait une couche d'abstraction) et donc soit vous le faites vous meme soit vous prévoyez de changer l'Arduino de temps en temps :)

perso pour la sauvegarde de paramètres j'utilise la NVRAM de la RTC DS1307 c'est moins risqué ... peut être que ton projet de thermostat s'enrichirait avec une horloge RTC