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)
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