Initialisation de char array et mémoire

Bonjour,

J'ai un nouveau problème.

Quand on compile un sketch, on obtient deux messages :

  • Un concernant la taille du sketch
  • Un concernant l'occupation mémoire par les "variable globales" et ce qui reste pour les variables locales du type "Les variables globales utilisent XXX octets (YYY%) de mémoire dynamique, ce qui laisse ZZZ octets pour les variables locales".

J'ai du mal avec cette notion de "variable globale / mémoire dynamique".
Pour moi, une variable globale est une variable qui est déclarée "globalement" en tête de sketch et qui est visible et utilisable par toutes les fonctions (contrairement aux variables locales qui sont déclarées au sein des fonctions et qui sont visibles et utilisables que par la fonction et qui "vivent" le temps d’exécution de la fonction.

Or, pour ma part, j'ai une fonctionne utilisé pour du bluetooth. Mon mobile doit envoyer une trame d'informations, et mon arduino (mega) doit la recevoir, la décoder et effectuer des traitements en conséquence.

Mes trames sont basées sur ce format [cmd_id:cmd_data], par ex. :

  • se baser sur une température constante => 101:30
  • se baser sur une température constante avec variation nocturne => 101:30&5
  • se baser sur une température variante mensuelle => 101:26-28-30-32-32-34-34-32-32-30-28-26
  • se baser sur une température variante mensuelle avec variation nocturne => 101:26&0-28&2-30&5-32&5-32&5-34&5-34&5-32&5-32&5-30&5-28&2-26&0

Du coup, j'ai une fonction qui récupère les données envoyées par le mobile et reçues sur le port serie du module bluetooth et qui reconstitue la trame au format "String".

Puis j'utilise les fonctions strtok(...) / strchr(...) basé sur cet ex. "how-do-i-split-an-incoming-string" pour découper ma trame et obtenir d'un côté mon id de commande et de l'autre les données.

Ensuite, je cherche donc à traiter les données.

Pour cela, je convertie ma "String" "trame" de données en char[] en faisant :

char charTrame[trame.lenght() + 1];

trame.toCharArray(charTrame, trame.lenght() + 1);

et ensuite je fais des traitements sur charTrame à l'aide de la fonction sscanf(...) par ex. :

char* data = '30&5';
char* pattern = '%d&%d'

int temp, var;

sscanf(data, pattern, &temp, &var);

// do stuff with data
updateParam(temp, var);

Toute la dernière partie se passe bien, mais quelque chose m'échappe au moment de la déclaration du char array avec la ligne char charTrame[trame.lenght() + 1];

Si je commente cette ligne et que je compile, j'obtiens le message "Les variables globales utilisent XXX octets (40%) de mémoire dynamique... blablabla".

Et si je décommente cette ligne et que je compile, j'obtiens le message "Les variables globales utilisent XXX octets (76%) de mémoire dynamique... blablabla".

Avec une ligne de commande je passe de 40% à 76% !!! WTF ?!

Alors, j'ai lu que la gestion des grandes quantités de texte pouvaient être problématique et que l'on pouvait déclarer certaine variable avec le mot clé "PROGMEM", mais sur les exemples que j'ai vu, ces variables sont déclarées de façon const ou const static, mais je ne sais pas si je peux utiliser ce genre de déclaration en convertissant une trame "String" de longueur aléatoire et faire un truc du style :

const static PROGMEM char charTrame[trame.length() + 1];
trame.toCharArray(charTrame, trame.lenght() + 1);

J'ai pas trouvé d'exemple allant dans ce sens... ou alors faut que je trouve un autre moyen de convertir ma String en char ou alors d'obtenir un char array directement en amont, au moment de la lecture sur port série...

Je sais pas... si quelqu'un à déjà fait face à ce genre de chose et qu'il a des suggestions, je suis preneur.

Ok, faut que je regarde... mes bases de C étant très très lointaines...

Avant d'aller plus loin dans mon programme, faut que je fasse une pause optimisation de toute façon.