Overflow sur Arduino 1.0 ?

Overflow sur Arduino 1.0 ?

Message non lude ReRRemi » Ven 1 Juin 2012 11:35

Bonjour à tous,

Hum je n'arriverais jamais à finir mon projet, j'ai une nouvelle erreur et très spéciale celle-ci ...

Lorsque je compile ce code tout se passe bien :

Code: Tout sélectionner
#include <SD.h>
#include <SPI.h>
#include <dht11.h>
#include <IRremote.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <RemoteTransmitter.h>

#define DHT11PIN 14     // ANALOG 0 (A0)
#define EMET434Mz 6     // Emetteur 434Mhz pour les prises electriques
#define EMET38Kz 3      // Emetteur 38Khz pour la télévision
#define HTTPPORT 8080   // Le port HTTP
#define BUFSIZ 100      //defines the buffer size.  100 gives plenty of room.  reduce size if more ram is needed.

EthernetServer server(HTTPPORT);
EthernetUDP Udp;
IRsend irsend;
dht11 DHT11;

byte mac[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
IPAddress ip( 192, 168, 1, 4 );
IPAddress gw( 192, 168, 1, 1 );
IPAddress sn( 255, 255, 255, 0 );

/* ####### L'adresse MAC du pc à démarrer ###### */
byte boot_pc_mac[] = {0x00, 0x23, 0x54, 0x35, 0x8E, 0x31};
IPAddress boot_pc_ip(192,168,1,3);
int boot_pc_port = 7;
byte bc[] = { 192, 168, 1, 255 };
/* ############################################# */

char rootFileName[] = "index.htm";

/* ####### Les variables utilisées pour la carte micro-SD ###### */
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
/* ############################################################# */

/* ####### Les couleurs de la LED RGB ###### */
int redPin = 9;
int greenPin = 10;
int bluePin = 11;
/* ######################################### */

/* ################# Les états ################ */
boolean etat_tv = false;
boolean etat_pc = false;
boolean etat_lum = false;
boolean etat_port = false;
boolean etat_entete = false;
/* ############################################ */

void error(String str) {  //Error function
  color(255, 0, 0); // Le service est arrêté : état ROUGE
  Serial.println(str);
  while(1);
}

void envoi433(unsigned long receivedCode, unsigned int period)
{
  color(255, 150, 0); // Diode Orange
  interrupts(); // Need interrupts for delay()
  RemoteTransmitter::sendCode(EMET434Mz, receivedCode, period, 3); // Retransmit the signal 8 times ( == 2^3) on pin 11. Note: no object was created!
}

void color (unsigned char red, unsigned char green, unsigned char blue)     // the color generating function
{    
    //analogWrite(redPin, 255-red);    
    //analogWrite(bluePin, 255-blue);
    //analogWrite(greenPin, 255-green);
}

void WOL(byte mac[])
{
    byte preamble[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    char i;

    Udp.beginPacket(bc, boot_pc_port);
    Udp.write(preamble, sizeof preamble);
   
    for (i=0; i<16; i++)
      Udp.write(mac, sizeof mac);
   
    Udp.endPacket();
}

void setup()
{
  /* Initialisation de la LED RGB
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  color(0, 0, 255);  // Le service s'initialise : état BLEU */
 
  Serial.begin(9600);
 
  // Initialisation de la carte micro-SD
  if (!card.init(SPI_FULL_SPEED, 4)) error("card.init failed!");  //If you are having errors when reading from the SD card, change FULL to HALF
  if (!volume.init(&card)) error("vol.init failed!");
  if (!root.openRoot(&volume)) error("openRoot failed");
 
  // Initialisation de la connexion Ethernet
  Ethernet.begin(mac, ip, gw, sn);
  // give the Ethernet shield a second to initialize:
  delay(1000);
  server.begin();
  delay(500);
  Udp.begin(boot_pc_port);
  delay(500);
  Serial.print("L'IP du serveur est ");
  Serial.println(Ethernet.localIP());
}

void loop()
{
  char clientline[BUFSIZ];
  char *filename;
  int index = 0;
  int image = 0;
  EthernetClient client = server.available();
 
  color(0, 255, 0); // Le service est lancé : état VERT
 
  if (client) {
    index = 0;
    while (client.connected()) {
      if (client.available()) {
     
     
        /* ####     Truc much qu'on ne s'occupe pas      ####
         ##                                                ## */
        char c = client.read();
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          if (index >= BUFSIZ)
            index = BUFSIZ -1;
          continue;
        }
       
        clientline[index] = 0;
        filename = 0;
        if (strstr(clientline, "GET / ") != 0) {
          filename = rootFileName;
        }
        if (strstr(clientline, "GET /") != 0) {
          if (!filename) filename = clientline + 5;
          (strstr(clientline, " HTTP"))[0] = 0;
        /* ##                                            ##
        /* #### Fin du Truc much qu'on ne s'occupe pas #### */
       
        // Recuperation des requetes
        if (strstr(clientline, "/engine.htm") != 0)
        {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connnection: close");
            client.println();
           
            if (strstr(clientline, "?state=all") != 0 || strstr(clientline, "?state=temp") != 0)
            {
                color(255, 255, 255); // On met la diode en blanche car on demande la temperature
                switch (DHT11.read(DHT11PIN))
                {
                    case  0: client.print("0:"+(String)DHT11.humidity+":"+(String)DHT11.temperature); break;
                    case -1: client.print("1"); break; // Erreur de checksum
                    case -2: client.print("2"); break; // Timeout
                    default: client.print("3"); break; // Erreur Inconnue
                }

                if (strstr(clientline, "?state=all") != 0)
                {
                    client.print(etat_lum? "|1":"|0"); // Etat de la lumière
                    client.print(etat_pc?  "|1":"|0"); // Etat du PC
                    client.print(etat_tv?  "|1":"|0"); // Etat de la TV
                    client.print(etat_port?"|1":"|0"); // Etat du portail
                }
            }
            else if(strstr(clientline, "?moins") != 0)
            {
                color(255, 0, 255); // Violet
                //irsend.sendNEC(0xFEE01F, 32);
                irsend.sendNEC(0xFD5AA5, 32); // TV Chambre Rémi
                client.println("1");
            }
            else if(strstr(clientline, "?plus") != 0)
            {
                color(255, 0, 255); // Violet
                //irsend.sendNEC(0xFEA05F, 32);
                irsend.sendNEC(0xFDD827, 32); // TV Chambre Rémi
                client.println("1");
            }
            else { client.println("0"); }
        }
        // Recuperation des fichiers
        else if (file.open(&root, filename, O_READ))
        {
            client.println("HTTP/1.1 200 OK");
            if (strstr(filename, ".htm") != 0)  //Sets content type.
                client.println("Content-Type: text/html");
            else if (strstr(filename, ".css") != 0)
                client.println("Content-Type: text/css");
            else if (strstr(filename, ".png") != 0)
                client.println("Content-Type: image/png");
            else if (strstr(filename, ".jpg") != 0)
                client.println("Content-Type: image/jpeg");
            else if (strstr(filename, ".gif") != 0)
                client.println("Content-Type: image/gif");
            else if (strstr(filename, ".3gp") != 0)
                client.println("Content-Type: video/mpeg");
            else if (strstr(filename, ".pdf") != 0)
                client.println("Content-Type: application/pdf");
            else if (strstr(filename, ".js") != 0)
                client.println("Content-Type: application/x-javascript");
            else if (strstr(filename, ".xml") != 0)
                client.println("Content-Type: application/xml");
            else
                client.println("Content-Type: text");
            client.println();
            int16_t c;
            while ((c = file.read()) >= 0) { client.write((char)c); }
            file.close();
        }
        // Aucune récupération
        else
        {
            client.println("HTTP/1.1 404 Not Found");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<h2>File Not Found!</h2>");
        }
      }
      else
      {
        client.println("HTTP/1.1 404 Not Found");
        client.println("Content-Type: text/html");
        client.println();
        client.println("<h2>File Not Found!</h2>");
      }
      break;
    }
   }
  delay(1);
  client.stop();
 }
}


J'ai ceci qui apparaît sur la console de série :
Code: Tout sélectionner
L'IP du serveur est 192.168.1.4


La taille de la compilation est : Binary sketch size: 24530 bytes (of a 32256 byte maximum)

Si je rajoute juste ceci après la ligne "else if(strstr(clientline, "?plus") != 0) { ... } ":
Code: Tout sélectionner
            else if(strstr(clientline, "?bas") != 0)
            {
                client.println("1");
            }


Là, la taille de la compilation est de : Binary sketch size: 24550 bytes (of a 32256 byte maximum)
Tout se met à bugguer, la console Serial m'affiche des messages bizarres :
L'I?L'IÌÌ??Pss?L'I?L'I?L'I?L'I?...
avec pleins de carrés...

Quelqu'un sait pourquoi ce bug survient sur mon Arduino Uno Ethernet ?

Je vais essayer de couper le code de la fonction loop en plusieurs fonctions en espérant que cela fonctionne :cry: .
ReRRemi
 
Messages: 15
Inscription: Dim 13 Mai 2012 18:24

Re: Overflow sur Arduino 1.0 ?

Message non lude SesechXP » Ven 1 Juin 2012 12:30

Salut,

Je commencerais par initialiser la variable clientline :
Code: Tout sélectionner
char clientline[BUFSIZ] = { '\0' };


Ce n'est peut-être pas la cause de ton problème, mais tôt ou tard ça en posera un...

Sinon il faudrait également observer la consommation en RAM de ton programme, parce là tu ne parles que de mémoire de programme (la flash) et à priori le problème de vient pas de là.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Overflow sur Arduino 1.0 ?

Message non lude ReRRemi » Ven 1 Juin 2012 15:30

Merci pour ton aide SesechXP, je n'avais pas pensé à la RAM il est vrai.

J'ai fais des tests avec cette librairie.

En voici le résultat :

En laissant le code dans la fonction loop :
Memoire libre : 103
L'I6e-06emoiobireemoem6eveur emoir6imoireeemoi6emem6eemoem6e)803
reme lieû0emoi-03 e iemoûoie+eme5gee iemo+o...
Ne fonctionne pas

En enlevant les trois quart du code dans la fonction loop :
Memoire libre : 198
L'IP du serveur est 192.168.1.4
Memoire libre : 125
Fonctionne

Donc c'est quasi-sûr que le problème vient de là, merci beaucoup ;).
Me reste plus qu'à faire une analyse de chaque module que j'appelle et de garder que l'utile. Je suis pas encore prêt de finir :D

Edit : Après analyse voilà un petit graphe :
Image

Donc il ne me reste après le chargement des modules que 690 octets sur les 2000 de bases, c'est le module SD.h qui me prend tout :?
ReRRemi
 
Messages: 15
Inscription: Dim 13 Mai 2012 18:24

Re: Overflow sur Arduino 1.0 ?

Message non lude SesechXP » Ven 1 Juin 2012 18:29

Tu peux également connaître la consommation en RAM avec avr-size (livré avec Arduino), sans recourir à une autre bibliothèque.

D'après les quelques lignes de code de ton premier message, tu peux faire quelques optimisations, notamment sur les types de tes variables : utiliser des uint8_t au lieu de int quand tes valeurs ne dépasseront pas 255, etc...

Concernant l'initialisation de ta variable, l'as-tu faite ? Car j'ai testé la fonction strstr avec un tableau non initialisé, les résultats sont pour le moins bizarres...
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35


Retourner vers Logiciel Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron