J'ai plusieurs "sons de cloches" à propos de sauvegarde en mémoire. Il y a la librairie eeprom.h mais il m'est dit qu'il ne faut pas utiliser celle-ci avec ESP32, mais plutôt preferences.h
Bien j'ai donc commencé avec preferences mais j'estime que c'est, pour moi, une usine à gaz, et je préfèrerais, de loin utiliser EEprom que je trouve juste efficace et simple (adresse->octet = parfait)
Confirmez vous de ne pas utiliser, sur l'ESP32, cette dernière ? Merci
Hervé
Salut.
Tout dépend des informations que l'on veut stocker.
Si ce sont des bytes ou des entiers, autant utiliser EEPROM, et dans ce cas, il est encore plus judicieux de regrouper ces informations dans une structure, afin de ne pas avoir à gérer l'offset.
Si ce sont des chaînes de caractères de longueur variable, je pense que préférences est le meilleur choix.
EDIT : lorsque l'on utiliser EEPROM il est pratiquement obligatoire d'ajouter un nombre magique à la structure, car en cas de modification de celle-ci, le logiciel peut lire le nombre magique, le reconnaître ou non, et agir en conséquence.
préférences n'a pas cet inconvénient.
Hello hbachetti,
Donc tu me confirmes qu'il n'y a pas de raisons de ne pas l'utiliser. Merci
Bah je vais avoir une trentaine d'octets... (IP-gateway-mask et quelques bricoles)
Mais tu m'interpelles avec le "nombre magique" Keskecé ?
Serait-ce un checksum ou quelque chose du genre ?
Enfin pour ma trentaine de bytes, je vais peut-être pas faire de structure.... J'essaye de faire le plus simple possible.
Amicalement
Hervé
Au contraire, avec une structure ce sera plus simple.
#define EEPROM_ADDR 0 // une seule adresse à gérer
struct __attribute__ ((packed)) eeprom_data
{
int a;
int b;
int c;
};
struct eeprom_data data; // structure de données
// ...
EEPROM.get(EEPROM_ADDR, data); // lecture des données
EEPROM.put(EEPROM_ADDR, data); // écriture
Oui, c'est très intéressant !
Je devrais me faire une banque de liens avec tout ce genre de tutos bien expliqués.
D'accord pour la structure.
Je ne vais toutefois pas mettre de sécurité sur le risque de corruption des datas en mémoire.
Ce sont, dans mon projet, des datas qui ne bougent quasi jamais... Une fois à l'installation et peut-être si on installe ailleurs....
De toutes mes mises en EEprom sur PIC j'ai jamais rien perdu. Je pense pas que l'ESP32 est plus capricieux ?
Ah... Tant que j'y suis, sur mes pics je faisais:
MOT var word
MOT.0 était de fait le byte0 de mon "MOT"
et MOT.1 ....
Tant à la lecture qu'à l'écriture en EEprom, ou série par exemple
Il existe un équivalent aussi simple pour arduino ?
J'ai trouvé ça:
byte low = intVar & 0xFF; // Take just the lowest 8 bits.
byte high = intVar >> 8; // Shift the integer right 8 bits.
Mais même si je pige le truc, c'est pas aussi simple.
Merci bien
De toutes mes mises en EEprom sur PIC j'ai jamais rien perdu. Je pense pas que l'ESP32 est plus capricieux ?
Contrairement aux PIC , AVR ...... les ESP32 et autres microcontrolleurs 32 bits ne contiennent pas d'EEPROM !!
La bibliothèque EEPROM se chargeant d'émuler une EEPROM dans un coin de la mémoire FLASH , avec comme conséquence un nombre de cycles effacement/écriture plus faible que celui des EEPROM
Perso je préfère à 'Eeprom' l'organisation proposée par la bibliothèque 'Préferences '
Non, il existe un équivalent en C (Arduino, c'est du pur C / C++) : les champs de bits
Cela va plus loin que découper un word en deux bytes. On peut donner la taille que l'on veut à chaque membre :
struct my_struct
{
int member1 : 8;
unsigned int member2 : 4;
unsigned int member3 : 4;
};
struct __attribute__((packed)) my_struct
{
int member1 : 8;
unsigned int member2 : 4;
unsigned int member3 : 4;
};
pour dire au compilateur qu'on veut vraiment que ça ressemble à cela si on veut à tout prix qu'il n'y ait que 2 octets sinon il peut prendre des libertés
Bien.... Merci les gars.
Je vais prendre un peu sur mon week end pour avaler ça.
C'est beaucoup de boulot, je pensais m'en sortir plus facilement / vite. Je me rends compte que j'ai bien plus à apprendre que prévu.
Je repasserais sur ce sujet si je rame...
PS: Pas vraiment de news de mon "prof" de superprofs... Je me demande si je me suis pas fait arnaqué, je patiente un peu....
Bonjour je suis de retour
Bien je suis parti pour utiliser preferences.h et j'ai ceci dans mon setup:
preferences.begin("my-ip", true); // initialize the preferences library with preference space allocation 4096 octets
// Lire l'adresse IP stockée à l'adresse "my-ip" dans la flash
uint8_t readIpAddress[4];
preferences.getBytes("my-ip", readIpAddress, 4);
if (readIpAddress[0] != 0){ // pas d'IP dans la flash, on affiche pas
Serial.print("Adresse IP lue : ");
Serial.print(readIpAddress[0]);
Serial.print(".");
etc...
et j'obtiens:
[ 4016][E][Preferences.cpp:50] begin(): nvs_open failed: NOT_FOUND
Un peu d'aide SVP ?
Merci