Go Down

Topic: Problème de mémoire saturée après plusieurs heures  (Read 188 times) previous topic - next topic

hatoupix

Bonjour à tous,

J'ai un soucis de "stabilité" ou de mémoire sur mon arduino Nano en fonctionnement continue

Contexte :
C'est un programme sur un Arduino Nano qui affiche sur un écran oled (SSD1306) des tensions provenant d'un ADS1015
à la compilation : 58% de stockage et 70% de mémoire dynamique

Problème :
Le programme fonctionne ! MAIS dès que je dépasse les 5-6 heures de fonctionnement EN CONTINUE eh bien l'arduino se "bloque" : l'affichage reste "figé", et les pin d'entrées ne sont plus actives, idem pour les interruptions. IDEM quand je suis en mode veille !
Par contre les premières heures tout fonctionne très bien.

Je pencherais plutôt pour un problème de "mémoire" saturée ... comme si il y avait des "fuites mémoires" ...


Merci pour vos aides !

J-M-L

Bonjour

utilisez vous la classe String?

Allouez vous dynamiquement de la mémoire vous même ou une de vos librairies ? sans code difficile de vous aider
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

hatoupix

Bonjour

utilisez vous la classe String?

Allouez vous dynamiquement de la mémoire vous même ou une de vos librairies ? sans code difficile de vous aider
Non, je n'utilise pas de string mais des display.print(F("mon texte"))

et non je n'alloue pas de mémoire moi même (je ne sais pas comment faire  :o )
Voici seulement les instructions que j'ai mis en copié/coller sans les comprendre réellement :
  ADCSRA = 0;   // Disable ADC
  // Disable the analog comparator by setting the ACD bit
  // (bit 7) of the ACSR register to one.
  ACSR = B10000000;
  // Disable digital input buffers on all analog input pins
  DIDR0 = DIDR0 | B00111111;

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);


et voici les bib que j'utilise :

Adafruit_SSD1306.h,
Adafruit_ADS1015.h,
RunningAverage.h,
LowPower.h,
simpleMinuteur.h


J-M-L

Vous allouez combien de mémoire pour votre RunningAverage ? la fonction qui crée un RunningAverage est écrite comme cela:
Code: [Select]
RunningAverage::RunningAverage(const uint8_t size)
{
    _size = size;
    _ar = (double*) malloc(_size * sizeof(double));
    if (_ar == NULL) _size = 0;
    clear();
}


la ligne _ar = (double*) malloc(_size * sizeof(double)); avec l'appel de la fonction malloc est celle qui alloue de la mémoire dynamique. un double est stocké sur 4 octets. si vous en allouez 250 par exemple, votre buffer fait donc 1000 octets, quasiment la moitié de la RAM de votre arduino Nano. Cette partie de la mémoire n'est pas visible à la compilation puisque allouée lors de l'exécution

Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

hatoupix

Vous allouez combien de mémoire pour votre RunningAverage ? la fonction qui crée un RunningAverage est écrite comme cela:
Code: [Select]
RunningAverage::RunningAverage(const uint8_t size)
{
    _size = size;
    _ar = (double*) malloc(_size * sizeof(double));
    if (_ar == NULL) _size = 0;
    clear();
}


la ligne _ar = (double*) malloc(_size * sizeof(double)); avec l'appel de la fonction malloc est celle qui alloue de la mémoire dynamique. un double est stocké sur 4 octets. si vous en allouez 250 par exemple, votre buffer fait donc 1000 octets, quasiment la moitié de la RAM de votre arduino Nano. Cette partie de la mémoire n'est pas visible à la compilation puisque allouée lors de l'exécution


J'alloue 2 fois 20 à la construction

J'appel deux fois la fonction addValue en permanence dans le loop ...

J-M-L

J'alloue 2 fois 20 à la construction
et c'est bien dans le setup() pas dans la loop()?
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

kamill

Bonjour,

Si tu soupçonnes un problème de mémoire, tu peux essayer d'afficher la mémoire libre dans un petit coin de ton afficheur et voir si elle diminue.
Code: [Select]
int freeRam ()
{
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

fdufnews

Si tu mettais ton code ce serait quand même plus simple de t'aider.

hatoupix

Merci pour vos conseils, je viens de mettre un petit bout de code pour afficher la mémoire restante (433 pour l'instant) ... maintenant il va me falloir attendre .... (et concernant l'allocation mémoire, c'est dans la déclaration (donc pas dans le loop)


hatoupix

actuellement j'ai 435 (bytes ?) de dispo ... et ça ne diminue pas ... par contre vu que j'alimente mon Arduino avec une batterie, il se peut que celle-ci diminue trop pour continuer à faire fonctionner correctement le système ... je continue en investiguant sur ce point !

merci pour vos aides

Go Up