Comment optimiser ce bout de code

Bonjour,

Je dois absolument optimiser mon code et j'aimerais éviter d'utiliser sprintf() et de créer une variable, comme cmd0, voir ci-dessous.

J'ai en effet un problème de mémoire et il ne reste que 180 byte pour les variable local!!

Voici le type de code que j'aimerais commencer par optimiser

char cmd0[39];
    sprintf(cmd0,"AT+FTPPUTNAME=\"%s.txt\"",readEEPROM(EEPADDRESS,TIMEADD));
    //if(sendATcommand2("AT+FTPPUTNAME=\"file.txt\"", "OK", 2000,true,false))
    if(sendATcommand2(cmd0, "OK", 2000,true,false))
    {
      #ifdef DEBUG
        sprintln(F("OK"));
      #endif
    }
    else
    {
      #ifdef DEBUG
        sprintln(F("KO"));
      #endif
    }

char * SIM908::readEEPROM(int deviceaddress, int eeaddress) 
{

  int i=0;
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();

  byte val = EEPROM.read(eeaddress);
  int va = (int)val;

 // char data[va+1];

  Wire.requestFrom(deviceaddress, va);

  while(Wire.available()){
    
    buffer[i] = Wire.read();
    i++;
  }
  buffer[i]='\0';
  
  return buffer;
  
}

Ce que j'aimerais faire c'est de remplacer file.txt pour ce que return la fonction readEEPROM(EEPADDRESS,TIMEADD)

if(sendATcommand2("AT+FTPPUTNAME=\"file.txt\"", "OK", 2000,true,false))

Un truc du genre:

if(sendATcommand2("AT+FTPPUTNAME=\" + myfonction() + \"", "OK", 2000,true,false))

Voyer-vous? Ou auriez-vous une idée pour optimiser ceci?

Je vous remercie

Salut,

Malheureusement y'a pas de secret, à un moment donné faudra bien que les données existe en RAM donc que tu passe par un sprintf() ou autre ça sera le même impact.

Une piste cependant : s'il y a des choses fixes, utiliser PROGMEM ou F() pour stocker en flash et non en RAM

Salut, je te remercie pour ta réponse. Je maitrise pas le PROGMEM et je pense que ca peut m'aider.

J'ai un buffer de 152

char buffer[152];

Mais il est déclarée dans une librairie.

sim908.h

...
public:
char buffer[152];
...

J'ai essayé de faire ceci

...
public:
PROGMEM char buffer[152];
...

En compilant, je n'ai pas d'erreur, mais je ne vois pas de différence. PS: Parc contre, le buffer et très utilisé, mais c'est ma plus grosse variable globale.

Merci pour tes infos ;)

Hum…!

Je ne sais pas à quoi correspond exactement ton buffer mais ce n’est pas une trés bonne idée d’utiliser PROGMEM dans ce cas là. Les mémoires de type flash ou EEPROM supporte assez mal la réécriture répétée de donnée.

Ce que te suggérait judicieusement B@tto était de mettre en mémoire flash des données statiques et communes aux nombreuses commandes de ton programme.

http://arduino.cc/en/Reference/PROGMEM

@+

Zoroastre.

T’as pas compris ce que j’ai dit …

s’il y a des choses fixes, utiliser PROGMEM ou F() pour stocker en flash et non en RAM

Un buffer, par définition, est variable. La lib a besoin de ça pour stocker ce qui arrive par série. Tu peux le réduire si tu n’utilise pas le GPRS ou bien si tes trames de réponse sont plus petite que ça.

Si je reprend une de tes lignes :

if(sendATcommand2("AT+FTPPUTNAME=\"file.txt\"", "OK", 2000,true,false))

en

#include <avr/pgmspace.h>
char buffer[30];
prog_char string_0[] PROGMEM = "AT+FTPPUTNAME=\"file.txt\"";

...

strcpy_P(buffer, (char*)pgm_read_word(&(string_0)));
if(sendATcommand2(buffer, "OK", 2000,true,false))

Hello B@tto, Merci pour ta réponse J'ai essayé ce que tu m'as montré. C'est un peu nouveau pour moi

Dans mon fichier sim908.cpp, j'ai ajouté ceci, tout en haut de a page, mais sous les autres #include

#include "avr/pgmspace.h"

J'ai compilé, et je n'ai pas eu d'erreur

Ensuite, dans une de mes fonction j'ai ajouté ceci:

prog_char string_0[] PROGMEM = "AT+FTPPUTNAME=\"file.txt\"";

J'ai compilé, et j'ai eu ce message d'erreur:

/Users/pierrot/Documents/Arduino/libraries/Sim908/Sim908.cpp: In member function 'void SIM908::data_send()': /Users/pierrot/Documents/Arduino/libraries/Sim908/Sim908.cpp:2894:7: error: 'prog_char' was not declared in this scope prog_char string_0[] PROGMEM = "AT+FTPPUTNAME=\"file.txt\"";

Pourquoi j'ai ce message alors que j'ai inclu la librairie??

#include "avr/pgmspace.h"

Merci pour ton aide

C'est dans ton fichier Arduino qu'il faut mettre #include "avr/pgmspace.h" pas dans sim908.cpp

Sinon essaye

char string_0[] PROGMEM = "AT+FTPPUTNAME=\"file.txt\"";