Question

En programmant pour mon Arduino (dans une sorte de mélange de C / C ++), j'ai remarqué quelque chose de bizarre.

Chaque fois que je communique via le port série, je surveille l'utilisation de la mémoire SRAM. Normalement, il se situe entre 300 et 400 octets. Cependant, après avoir ajouté une nouvelle routine (voir ci-dessous), j’ai remarqué qu’elle passait toujours de 300 à 400 octets de mémoire libre à EXACTEMENT 1023. Mon impression est qu’il ya un problème.

Ceci est la nouvelle routine

void NewRoutine(char *cmdd){

   GSM.print(cmdd);
   GSM.print(26, BYTE);
   GSM.print(endl); // <-- added later
   Serial.print(availableMemory());
}

Et voici la routine MemoryCheck

  int availableMemory() {
  int size = 1024;
  byte *buf;
  while ((buf = (byte *) malloc(--size)) == NULL);
  free(buf);
  return size;
}

Veuillez noter ceci: d’abord, cela n’a pas fonctionné. Après avoir ajouté la commande endl, cela a fonctionné comme par magie, mais j’ai remarqué le problème de mémoire.

Quelqu'un a-t-il des idées de solution de contournement?

Était-ce utile?

La solution

La raison pour laquelle vous obtenez 1023 octets de mémoire libre est simplement due au fait que le malloc (sur 1023 - soit - 1024) réussit au premier essai. Cela signifie que vous avez au moins 1023 octets de mémoire, mais ne vous indique pas la véritable mémoire disponible.

Avant cela, vous devez avoir eu quelque chose qui garde la mémoire autour. Mon hypothèse est la classe GSM ici - elle contient probablement les données (cmdd + 26) dans un tampon interne qui est vidé sur une nouvelle ligne. Dès que vous avez ajouté votre appel endl, vous récupérez probablement toute la mémoire du tampon.

Quelle est la taille de votre commande? Mon hypothèse est qu’elle (ou la totalité de celles-ci) est probablement d’environ 700 octets ...

Autres conseils

Peut-être qu'il contient un tampon sur le tas pour transférer des données sur le port série?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top