Gestion mémoires (probablement
Bonjour,
3 ans que je m'éclate avec Arduino. Tant que je réalisai des petites applications, tout allait bien, mais maintenant avec l'évolution vers des projets plus ambitieux, je but sur des problèmes de fonctionnement que j'ai identifiés comme des problèmes de mémoire.
J'ai lu tout ce qui était disponible sur le sujet, mais je ne m'en sort pas.
J'ai un petit exemple qui montre bien le souci, ce programme a pour but de créer une variable sous forme de structure stockée en EEPROM avec les paramètres du programme.
Globalement tout fonctionne parfaitement, j'ai exclu toute utilisation de String afin de limiter les ennuis.
SAUF que la ligne 55 est en commentaire, si on enlève ce commentaire, plus rien ne fonctionne !!!
Le problème concerne essentiellement les adresses IP, si on laisse les 3 cela ne fonctionne pas, si on en supprime une ça marche.
Il s'agit bien que de l'impression sur moniteur série, les 3 infos sont parfaitement enregistrées dans la structure et dans l'EEPROM.
D'où ce problème peut-il venir ? il s'agit d'un tout petit programme qui tourne sur un MEGA2560 pro, ça doit être assez confortable.
Merci de votre aide, à charge de revanche
Patrick
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
/*Test EEPROM et Struct
*24 avril 2021
*le but est de paramétrer le site et les produits à partir de l'EEPROM
*si l'info n'existe pas, la demander au serveur et l'enregistrer pour la suite.
*1 site et 3 produits ensuite les clients qui se connectent.
*/
#include <EEPROM.h>
#include <Ethernet2.h>
//#include <Arduino.h> ne semble pas utile ici
/** Le nombre magique et le numéro de version actuel */
static const unsigned long STRUCT_MAGIC = 123456769;
static const byte STRUCT_VERSION = 5;
/*j'ai essayé de stocker les déclaration dans un fichier extérieur
* aucune amélioration */
//#include "PAT.h"
/*structure principale du projet */
struct EPR_Site1 {
unsigned long magic;
byte struct_version;
IPAddress IP_S; //Serveur principal
IPAddress IP_E; //Serveur Erreur
IPAddress IP_L; //IP Local si pas de DHCP
boolean S_DHCP; //utiliser le DHCP local
int Port_S; //port Serveur
int Port_E; //port Erreurs
int ID_Site; //ID du site
char Nom_Site[25]; //Nom du site
char CA_Serv[15]; //Carte Service
};
/** L'instance de la structure, globale, car utilisé dans plusieurs endroits du programme */
EPR_Site1 E_Site1;
/*adresse de l'EEPROM de chaque structure*/
int Adr_Site=0;
void setup() {
Serial.begin(9600);
Serial.println();
Serial.println("------------------SETUP GO...");
Serial.println(freeRAM());
/* Récupére les données du programme en EEPROM*/
LireParamEEPROM(0);
Serial.println(F("------------------Affichage des infos recueillies"));
Serial.print(F("magic :"));Serial.println(E_Site1.magic);
Serial.print(F("version :"));Serial.println(E_Site1.struct_version);
Serial.print(F("IP serveur :"));Serial.println(E_Site1.IP_S);
Serial.print(F("IP_Erreur :"));Serial.println(E_Site1.IP_E);
//Serial.print(F("IP_Local :"));Serial.println(E_Site1.IP_L);
Serial.print(F("DHCP :"));Serial.println(E_Site1.S_DHCP);
Serial.print(F("Port Erreur :"));Serial.println(E_Site1.Port_E);
Serial.print(F("Port Serveur :"));Serial.println(E_Site1.Port_S);
Serial.print(F("ID Site :"));Serial.println(E_Site1.ID_Site);
Serial.print(F("Nom Site :"));Serial.println(E_Site1.Nom_Site);
Serial.print(F("Carte service :"));Serial.println(E_Site1.CA_Serv);
Serial.println("------------------c'est TOUT");
Serial.println(freeRAM());
}
void loop() {
// put your main code here, to run repeatedly:
}
/******************************************FONCTIONS
***************************************************
** Charge le contenu de la mémoire EEPROM dans la structure */
void LireParamEEPROM(byte TYPE) {
Serial.println("------------------Lecture EEPROM");
EEPROM.get(Adr_Site, E_Site1);
/*Détection d'une mémoire non initialisée*/
byte Erreur;
Erreur= E_Site1.magic != STRUCT_MAGIC;
if (Erreur) {
/*demander une connection complète au serveur*/
/*----------------------------------------simulation retour serveur pour les tests*/
IPAddress IPS(192,168,0,65);
IPAddress IPE(192,168,0,85);
IPAddress IPL(192,168,0,147);
int PortS=10007;
int PortE=10000;
/*enregistrement des données dans la structure*/
E_Site1.magic=STRUCT_MAGIC;
E_Site1.struct_version=5;
E_Site1.IP_S= IPS;
E_Site1.IP_E= IPE;
E_Site1.IP_L= IPL;
E_Site1.Port_S=PortS;
E_Site1.Port_E=PortE;
E_Site1.S_DHCP=1;
E_Site1.ID_Site=251;
strcpy(E_Site1.CA_Serv,"c21d54f2174ws");
strcpy(E_Site1.Nom_Site,"St Jean de Vedas");
/*sauvegarder les données en EEPROM*/
Serial.println("------------------écriture en EEPROM");
EEPROM.put(Adr_Site, E_Site1);
}else{
/*sinon on ne fait rien d'autre que lire les donnéeds en EEPROM*/
}
return;
}
int freeRAM()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start: (int) __brkval);
} |