[RESOLU]Optimisation SRAM

Bonjour à tous,

Depuis peu, lorsque je compile mon programme j’ai ce message :

" Les variables globales utilisent 7 571 octets (92%) de mémoire dynamique, ce qui laisse 621 octets pour les variables locales. Le maximum est de 8 192 octets.
La mémoire disponible faible, des problèmes de stabilité pourraient survenir. "

J’utilise un Mega2560 et donc 8KB de SRAM (aucune information sur la DRAM). J’ai un nombre important de variables globales, 120 environ dont le tiers sont des booléens. J’avais fait un petit calcul et estimé que si je n’utilisais que des variables de type “long” je pouvais utiliser jusqu’à 265 variables environ avec 8KB de SRAM. Pourtant je suis à peine à la moitié.

Est-il possible d’étendre la DRAM en prenant un peu dans la Flash ou dans la SRAM ?

Est-ce que mon programme risque vraiment d’avoir un problème de stabilité avec le temps ?

Je vous remercie.

Salut,

akuma8:
" Les variables globales utilisent 7 571 octets (92%) de mémoire dynamique, ce qui laisse 621 octets pour les variables locales. Le maximum est de 8 192 octets.
La mémoire disponible faible, des problèmes de stabilité pourraient survenir. "

J'utilise un Mega2560 et donc 8KB de SRAM (aucune information sur la DRAM). J'ai un nombre important de variables globales, 120 environ dont le tiers sont des booléens. J'avais fait un petit calcul et estimé que si je n'utilisais que des variables de type "long" je pouvais utiliser jusqu'à 265 variables environ avec 8KB de SRAM. Pourtant je suis à peine à la moitié.

je sais pas comment tu as fait ton calcul mais à 4 bytes le long ça fait plutôt une capacité de 2000 long (8000/4). Donc tu as un autres gros consommateur ...

akuma8:
Est-il possible d'étendre la DRAM en prenant un peu dans la Flash ou dans la SRAM ?

Non. Mais il est possible de placer des constantes en flash (voir PROGMEM et F() )

akuma8:
Est-ce que mon programme risque vraiment d'avoir un problème de stabilité avec le temps ?

Ooooh oui

En fait, il n'y a pas de DRAM dans un Arduino.
Uniquement de la RAM qui contient des données et la Flash qui contient le code et des données statiques.

B@tto:
Salut,

je sais pas comment tu as fait ton calcul mais à 4 bytes le long ça fait plutôt une capacité de 2000 long (8000/4). Donc tu as un autres gros consommateur ...

Je me suis sans doute grillé sur le KB (kilobyte) et le KB (Kilobit).
Soit, je suis encore très très loin d'avoir atteint la capacité de la SRAM et je ne vois pas ce qui peut prendre de la place en plus. J'espère que les prototypes des fonctions ne prennent pas de la mémoire en plus.

B@tto:
Non. Mais il est possible de placer des constantes en flash (voir PROGMEM et F() )

Ooooh oui

Je vais voir cela même si toutes mes constantes sont des macro définies avec un "#define" lesquels en théorie ne prennent pas de place.

Merci

fdufnews:
En fait, il n'y a pas de DRAM dans un Arduino.
Uniquement de la RAM qui contient des données et la Flash qui contient le code et des données statiques.

C'est ce que je pensais aussi jusqu'à l'apparition de ce message : "Les variables globales utilisent 7 638 octets (93%) de mémoire dynamique,..."

Très souvent, les problèmes de RAM disponible sont liés à l'utilisation de chaînes de caractères littérales.
Ne serait-ce pas le cas ici ?

Par exemple :

Serial.println("Bonjour");// occupe 8 octets en permanence en RAM

Tous les textes constants, mis dans le code entre des double guillemets, sont stockés en RAM de manière permanente.
Dans le code compilé, le texte constant est remplacé par un pointeur vers l'adresse RAM où il est stocké.

Au démarrage de l'arduino, le contenu de la RAM est initialisé par copie du contenu de la mémoire flash.

Avec des chaînes de caractères, on arrive vite a bouffer toute la minuscule RAM d'un arduino.
D'où la nécessité d'utiliser PROGMEM.
Cela évite d'allouer en permanence de la RAM pour les variables constantes, mais oblige à les recopier en RAM avant chaque utilisation (moins performant).

bricoleau:
Très souvent, les problèmes de RAM disponible sont liés à l’utilisation de chaînes de caractères littérales.
Ne serait-ce pas le cas ici ?

Par exemple :

Serial.println("Bonjour");// occupe 8 octets en permanence en RAM

Tous les textes constants, mis dans le code entre des double guillemets, sont stockés en RAM de manière permanente.
Dans le code compilé, le texte constant est remplacé par un pointeur vers l’adresse RAM où il est stocké.

Au démarrage de l’arduino, le contenu de la RAM est initialisé par copie du contenu de la mémoire flash.

Avec des chaînes de caractères, on arrive vite a bouffer toute la minuscule RAM d’un arduino.
D’où la nécessité d’utiliser PROGMEM.
Cela évite d’allouer en permanence de la RAM pour les variables constantes, mais oblige à les recopier en RAM avant chaque utilisation (moins performant).

Effectivement c’est là où vient le problème et le pire c’est que les autres appels aux fonctions de la communication série telles que : Serial1… et Serial2… ne marchent pas dans certains cas et le programme les saute sans en tenir compte.
Le soucis c’est que j’utilise Serial.println() pour ‘débugger’ (comme presque tout le monde), si je les enlève je risque de louper les erreurs incrustées dans mon programme.
Je vais voir comment fonctionne l’utilisation de PROGMEM afin de garder quand même mes Serial.println().

Merci

Pour les Serial.println il y a une solution toute simple, grâce à la macro F

Serial.println(F("Bonjour"));//Pas de RAM utilisée

bricoleau:
Pour les Serial.println il y a une solution toute simple, grâce à la macro F

Serial.println(F("Bonjour"));//Pas de RAM utilisée

Tout à fait ça.
Je viens de passer de 90% de RAM utilisé à 10%.