IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Gestion mémoires (probablement


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Directeur technique
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Par défaut 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 : 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); 
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    IPAdress est un type de classe, donc ce que vous avez dans la structure c'est plus ou moins un pointeur vers l'instance, c'est cela que vous mettez en EEPROM. (je simplifie)

    Restaurer une classe comme cela n'a pas de sens, le pointeur bien sûr pointera nulle part (en pratique les données qui sont là ne sont pas suffisante pour refaire l'instance)

    il faut sérialiser et désérialiser la classe (en gros écrire un flux d'octets qui permet de représenter l'état de l'instance pour la recréer plus tard)

    le plus simple serait de mettre 3 tableaux de 4 octets au lieu de vos IPAddress

  3. #3
    Membre régulier
    Homme Profil pro
    Directeur technique
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Par défaut ok, je teste
    Merci Jay, je teste ça dès demain soir, mais comment sait-on que "IPAdress" est un pointeur ?
    merci de votre réponse rapide.
    Patrick

Discussions similaires

  1. Thread POSIX et gestion mémoire
    Par pier* dans le forum POSIX
    Réponses: 1
    Dernier message: 07/07/2006, 21h36
  2. TAO, Value types et gestion mémoire
    Par TiChabin972 dans le forum CORBA
    Réponses: 1
    Dernier message: 25/04/2006, 20h55
  3. [D7] Tableau dynamique et Gestion mémoire
    Par Cl@udius dans le forum Langage
    Réponses: 7
    Dernier message: 13/03/2006, 15h16
  4. [Gestion mémoire] SetLength sur TDoubleDynArray
    Par MD Software dans le forum Langage
    Réponses: 14
    Dernier message: 24/04/2005, 21h11
  5. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo