Pages: [1]   Go Down
Author Topic: Problème de mémoire, ca plante!  (Read 452 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Mon programme avance!!!. Sauf qu'à un moment, il crash et recommence comme si j'avais appuyé sur le bouton reset.
La function setup() est appelé.

J'au trouvé une petite fonction quo va affché la RAM. Je vous avoue pas trop la comprendre
Code:
static void freeRAM (){
  extern int __heap_start, *__brkval;
  int v;
  int free = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
  Serial.print(F("Free RAM : "));
  Serial.println(free);
}

Il en est que lorsque je lance mon programme, il affiche 518.
Il collecte les position GPS, et a ce moment là il affiche 193.
Puis il appelle une fonction void sendGPRS();
Au début de la fonction, il affiche 33.
et ca s'arrete ou ca "reboot".

Comment puis-je controllwe la RAM et resoudre ce problème

Milles mercis pour vos lumières
« Last Edit: February 20, 2013, 03:04:18 pm by pierrot10 » Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3597
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sans déconner : sans poster le code, comment penses-tu qu'on va pouvoir t'aider ?!
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley Bne oui mais c'est beaucoup de code à lire, et à se retrouver
Voici mon code netier : http://www.hello-web.net/temp/forum.txt
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3438
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu n'aurais pas une variable qui déborde?
coords m'a l'air de contenir une chaine assez volumineuse.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai supprimé coords.
Ca n'existe plus. Aussi tout cette partie

Code:
// Preparing data
   
      //strcpy(data, "date");
      //strcat(data, ",");
      /*
      strcpy(coords, request);
      */
  /*
      strcpy(coords, "?");
     
      strcat(coords, "lat=");
      // Latitude
      dtostrf(flat, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //Longitude
      strcat(coords, "long=");
      dtostrf(flon, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //Altitude
      strcat(coords, "alt=");
      dtostrf(falt, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //Speed
      strcat(coords, "speed=");
      dtostrf(fspeed, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //dtostrf(fcourse, 2, 4, coordinate);
      //Course
      strcat(coords, "course=");
      strcat(coords, TinyGPS::cardinal(gps.f_course()));
      //strcat(data, "\r\n");
   */ 
      /*
      // Terminate the string
      strcat(coords, " HTTP/1.1");
      // Terminate the string
      strcat(coords, "\0");
      */
     
     

je l'ai aussi supprimée pour la remplacé avec ca

Code:
      Serial.println(request + "?lat=" + char(flat) + "&long=" + char(flon) + "&alt=" + char(flat) + "&speed=" + char(fspeed) + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + char(fage) + request_end);

ce qui est plus simple. Mais ca plantze toujours à ce niveau
Code:
void sendGPRS(){
  //cell.println("AT+SBAND=6");
  Serial.print(F("Bening sendGPRS -> "));
  freeRAM();
  #ifdef DEBUG
    Serial.println(F(""));
    Serial.println(F("Attaching GPRS..."));
  #endif
  Serial.print(F("Att -> "));
  cell.println("AT+CGATT=1");
  Serial.print(F("cell -> "));
  freeRAM();
  waitFor("OK");
  freeRAM();

Il affiche "Attaching GPRS", "Att", mais je ne peux vous dire s'il affiche "cell" pour le moment, car viens de l'ajouter, et l'autre problème que j'ai c'est qu'il chooppe le posistion GPS, généralement vers 20h. Donc tant que je n'ai de position GPS, il ne va pas plus loin, donc n'arrive pas à "attaching GPRS"

Mais il n'y pas moyne de gérer la mémoire???

En fait j'ai constaté qu'avant la fonction sendGPRS, il a 287 de mémoire (freeRAM) et juste après "être entré" dams la fonction "sendGPRS",

il n'a plus que 87....
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

J'au trouvé une petite fonction quo va affché la RAM. Je vous avoue pas trop la comprendre
En même temps je connais pas beaucoup de personne capable de me lister les variables internes de GCC gérant l'allocation de la mémoire ...

Code:
const String apn = "internet"; // access-point name for GPRS
const String ip = "xx.xxx.xx.xxx"; // IP address of server we're connecting to
const String host = "server.dyndns.org"; // required in HTTP 1.1 - what's the name of the host at this IP address?
const String requests = "GET /opt/updatesql.php?lat=1.10&long=1.20&alt=1.30&speed=1.40&course=1.50 HTTP/1.1";
const String request = "GET /opt/updatesql.php";
const String request_end = " HTTP/1.1";
const String useragent = "Mozilla/5.0";
Tout ça devrait être des const char[] en flash (voir PROGMEM)

Code:
int redLedPinGPRS  = 13;
int greenLedPinGPRS = 12;
int redLedPinGPS  = 11;
int greenLedPinGPS = 10;
"const byte" au lieu de int

Code:
Serial.println("");
pas besoin de quote :
Code:
Serial.println();

Code:
cell.println("AT+CMGF=1"); // set SMS mode to text
cell.print("AT+CMGS=");  // now send message...
Toutes les chaines de caractères devraient être en flash pour économiser de la RAM (macro F("...."))

Code:
cell.print("\"");
Pour un caractère write() est bien plus adapté :
Code:
cell.write('"');

Code:
//strcpy(data, "date");
      //strcat(data, ",");
      /*
      strcpy(coords, request);
      */
      strcpy(coords, "?");
     
      strcat(coords, "lat=");
      // Latitude
      dtostrf(flat, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //Longitude
      strcat(coords, "long=");
      dtostrf(flon, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //Altitude
      strcat(coords, "alt=");
      dtostrf(falt, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //Speed
      strcat(coords, "speed=");
      dtostrf(fspeed, 2, 4, coordinate);
      strcat(coords, coordinate);
     
      strcat(coords, "&");
     
      //dtostrf(fcourse, 2, 4, coordinate);
      //Course
      strcat(coords, "course=");
      strcat(coords, TinyGPS::cardinal(gps.f_course()));
      //strcat(data, "\r\n");
     
      /*
      // Terminate the string
      strcat(coords, " HTTP/1.1");
      // Terminate the string
      strcat(coords, "\0");
      */
     
      Serial.println(request + String(coords) + request_end);
Sérieusement ? ... c'est moche ...

De même que :
Code:
Serial.println(request + "?lat=" + char(flat) + "&long=" + char(flon) + "&alt=" + char(flat) + "&speed=" + char(fspeed) + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + char(fage) + request_end);
... en plus d'être complétement faux (caster un float en char c'est comme vouloir faire passer un camion dans le coffre d'une fiat panda).

Tu peut envoyer une chaine de caractères sans retour ligne morceau par morceau c'est tellement plus simple ...
Code:
Serial.print(request);
Serial.print(F("?lat="));
Serial.print(flat, 4);
Serial.print(F("&long="));
Serial.print(flon, 4)
Serial.print(F("&alt="));
Serial.print(flat, 4);
Serial.print(F("&speed="));
Serial.print(fspeed, 4);
Serial.print(F("&course="));
Serial.print(TinyGPS::cardinal(gps.f_course());
Serial.print(F("&age="));
Serial.print(fage, 4);
Serial.println(request_end);

Code:
String ready = getMessage();
   
         if(ready == "+SIND: 1"){
           Serial.println(F("> SIM is inserted ..."));
         }
         
         if(ready == "+SIND: 10,\"SM\",1,\"FD\",1,\"LD\",1,\"MC\",1,\"RC\",1,\"ME\",1"){
           Serial.println(F("> SIM is ready ..."));
         }
         
         if(ready == "+SIND: 11"){
           GPRS_registered = 1;
           Serial.println(F("> Module is registered to network ..."));
         }
         
         if(ready == "+SIND: 3"){
           Serial.println(F("> GPRS is partially ready ..."));
         }
         
         if(ready == "+SIND: 4"){
           GPRS_AT_ready = 1;
           Serial.println(F("> GPRS is ready ..."));
         }
         
         if(ready == "+SIND: 7"){
           Serial.println(F("> Emergency only ..."));
         }
         
         if(ready == "+SIND: 0"){
           Serial.println(F("> SIM card removed"));
         }
Fait en sorte que ta fonction getMessage() stocke le message reçu dans un char[] de taille fixe (en variable globale).
Ça t'évitera d'allouer des String à tout bout de champ en faisant des if qui cast implicitement les chaines de char en String.
En plus avec un tableau en variable globale les chaines de char constantes de tes if pourrons être mis en flash avec F("...) et testé avec la fonction strcmp_PF().

Remarque : c'est à coup sûr cette fonction qui fragment le peu de RAM qu'il te reste et fait tout planter.

Pour résumer :
- remplace toutes tes utilisations de String par des tableaux de char, tu devrais te rendre compte immédiatement à quel point le code actuel tue la RAM.
- encapsule toute tes chaines de caractères constantes par F("...") pour les stocker en flash
- évite les concaténation et les traitements inutiles.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: