Yahoo refuse tous les emails du site. Si vous avez une adresse chez un autre prestataire, c'est le moment de l'utiliser ;)

En cas de soucis, n'hésitez pas à aller faire un tour sur la page de contact en bas de page.

Topic "Gestion mémoire ARDUINO"

Flux RSS des posts récents dans ce topic ( Flux Atom)


#1087 | Signaler ce message


Bonjour, j'ai problème de fonctionnement lié (je pense) à la gestion de la mémoire, j'ai pourtant tout lu sur ce sujet, mais je n'arrive pas à régler le problème. j'ai réalisé un bout de code extrait d'un ensemble beaucoup plus important, mettant clairement le problème en situation. Globalement j'ai une structure que je stocke en EEPROM pour démarrer mon programme. j'écris les données en EEPROM puis aux lancement suivant je ne fais que les lire et tout se passe bien. sauf que si l'on regarde la ligne 55, j'ai du la mettre en commentaire pour que cela fonctionne. si l'on enlève le commentaire, le programme part complètement dans le décor !!! l'information est bien stockée dans la structure mais ne peut pas s'afficher et le problème est récurant avec les 3 adresses IP ??? il suffit d'en supprimer une pour que cela fonctionne. Ma question si quelqu'un peut m'aider c'est : OU EST CE QUE JE ME PLANTE ? Il y a clairement quelque chose qui m'échappe dans la gestion de la mémoire, mais je ne comprends pas. J'ai supprimer toute utilisation des String, mais cela ne suffit pas, et dans ce cas la taille du programme est ridicule, il tourne sur un MEGA2560 pro. MERCI de votre aide. Patrick

  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
/*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); 
}  

Derniére modification le par PATRICK.POURMONET