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 : Sélectionner tout - Visualiser dans une fenêtre à part
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); 
}