Bonjour à tous!!
Je fais face a un problème de mémoire.
J'ai un Leonoardo et sur le terminal, il est écrit
Sketch uses 23,454 bytes (81%) of program storage space. Maximum is 28,672 bytes.
Global variables use 1,891 bytes (73%) of dynamic memory, leaving 669 bytes for local variables. Maximum is 2,560 bytes.
Low memory available, stability problems may occur.
Je veux encore utiliser une carte SD, sauf si je peux faire autrement (quand je GSM n'est pas disponible, les données doivent etre écrites dans une carte SD). Si j'ajoute la librairie SD, ma mémoire monte à 95%. Grrrr.
Donc je dois obtimiser mon code.
Pour le moment j'ai beaucoup de Serial.println()
#ifdef DEBUG
Serial.prinlln(F("Affichage\n"));
#endif
Es-ce que le \n a une influence sur la mémoire?
Si je commente
//#define DEBUG
je gagne 16% de place. Ce qui est énorme.
Premiere question, comment puis-je obtimiser mes débug, car j'en ai besoin.
Si je fais une fonction de se genre
void sprintln(char * message)
{
Serial.println(message);
}
Es-ce que je vais vraiment y gagner?
Et comment puis-je utiliser le F de (F(""));?
Qu'es-ce qu'il prend le plus de place, la fonction Serial.println(), ou le texte à imprimer?
Deuxième question
J'ai beaucoup de
if(val) // val est un bool
{
retun true;
}
else
{
return false
}
En terme de mémoire, Ne serait-il pas mieux de faire
if(val) return true;
return flase;
Troisième question
Que me suggeriez-vous pour obtimiser ce code.
Avant cette fonction, il y a la fonction sms_read(). Quand le sms est le lu, il envoi le contenu du message à
send_command(). le paramètre command, est le message du SMS.
La fonction sendCommande() va donc lire le message.
S'il lit, 'sms,r' , 'sms,s' , 'dir,w,+213334443333' , 'dir,r', 'dir,d,2' etc, il va appeler une fonction.
Si non il efface le SMS dont le texte n'est pas confirme à une command.
int SIM908::sendCommand(char * command)
{
//int is=0;
//char inSerial[25]; // expl: dir,w,+41567771122
bool sent = false;
if(!strncmp(command,"call",3))
{
splitString(command,splitedString);
if(!strncmp(splitedString[1],"me",1))
{
// sms_send(2,"Boubaa will not call you but it just auto reply to your SMS!");
sms_send(_owner,"Boubaa will not call you but it just auto reply to your SMS!");
sent = 3; // not delete but change mode to read
}
}
else if(!strncmp(command,"dir",3))
{
splitString(command,splitedString);
if(!strncmp(splitedString[1],"w",1))
{
int lenPhone = strlen(splitedString[2]);
//Serial.println(lenPhone);
if(lenPhone < 12)
{
#ifdef DEBUG
Serial.println(F("\n> Min, 12 digits with de +\n"));
Serial.println(splitedString[2]);
#endif
}
else
{
if(dir_write(splitedString[2]))
{
#ifdef DEBUG
Serial.println(F(" Phone saved"));
#endif
sent = 1;
}
else
{
#ifdef DEBUG
Serial.println(F(" Phone not saved"));
#endif
sent = 2;
}
}
}
else if(!strncmp(splitedString[1],"r",1))
{
for(int di=1; di<=_max_phone_in_dir; di++)
{
dir_read(di);
}
sent = 1;
#ifdef DEBUG
Serial.println(F(""));
#endif
}
else if(!strncmp(splitedString[1],"d",1))
{
if(dir_delete(atoi(splitedString[2])))
{
#ifdef DEBUG
Serial.println(F(" Phone deleted"));
#endif
sent = 1;
}
else
{
#ifdef DEBUG
Serial.println(F(" Phone not deleted"));
#endif
sent = 2;
}
}
}
else if(!strncmp(command,"gps",3))
{
splitString(command,splitedString);
if(!strncmp(splitedString[1],"1",1))
{
if(gps_read(1)) sent = 1;
sent = 2;
}
else if(!strncmp(splitedString[1],"0",1))
{
if(gps_read(0))
{
sent = 1;
}
else
{
sent = 2;
}
}
else if(!strncmp(splitedString[1],"c",1))
{
if(gps_cellid())
{
sent = 1;
}
else
{
sent = 2;
}
}
else
{
if(gps_read(0))
{
sent = 1;
}
else
{
sent = 2;
}
}
}
/* Enable GSM */
else if(!strncmp(command,"egsm",4))
{
gsm_enable();
sent = 1;
}
/* Enable GPS */
else if(!strncmp(command,"egps",4))
{
gps_enable();
sent = 1;
}
/* SEND SMS*/
/* sms,r is not read if the command is received from a SMS.
sent can return true, becaus the terminal display the message...
*/
else if(!strncmp(command,"sms",3))
{
splitString(command,splitedString);
if(!strncmp(splitedString[1],"r",1))
{
sms_read(2); // List REC RAED
sent = 1;
}
else if(!strncmp(splitedString[1],"u",1))
{
sms_read(1); // List REC UNREAD
sent = 1;
}
else if(!strncmp(splitedString[1],"a",1))
{
sms_read(3); // List REC ALL
sent = 1;
}
else if(!strncmp(splitedString[1],"s",1))
{
if(sms_send(_owner,"Boubaa sent you a test SMS"))
{
#ifdef DEBUG
Serial.println(F(" SMS sent\n"));
#endif
sent = 1;
}
else
{
#ifdef DEBUG
Serial.println(F(" SMS Not sent\n"));
#endif
sent = 2;
}
}
else if(!strncmp(splitedString[1],"d",1))
{
if(sms_delete(atoi(splitedString[2])))
{
#ifdef DEBUG
Serial.println(F("> SMS Deleted\n"));
#endif
sent = 1;
}
else
{
#ifdef DEBUG_SMS
Serial.println(F("> SMS Not deleted\n"));
#endif
sent = 2;
}
}
else
{
#ifdef DEBUG
Serial.println(F(" The command is unknow. SMS will be deleted."));
#endif
sent = 0;
}
}
return sent;
// }
}
Derniere question
J'avais lu que strcpy() et sprintf() utilisait beaucoup de mémoire, es-ce vrai? Comment pourrais-je alors faire autrement?