2009-06-24 19 views
2

Programmation pour mon Arduino (dans une sorte de mélange de C/C++), j'ai remarqué quelque chose d'étrange.Problème de mémoire C/C++?

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

Voici la nouvelle routine

void NewRoutine(char *cmdd){ 

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

Et c'est le MemoryCheck de routine

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

S'il vous plaît noter ceci: D'abord, il ne fonctionne pas. 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 at-il des idées pour une solution de contournement?

+1

Bienvenue dans Stack Overflow! –

+0

Mike, je suggère d'éviter d'utiliser malloc dans une machine RAM 1K. Vous devriez pouvoir vous en sortir sans l'utiliser dans cette situation. :-) –

Répondre

6

La raison pour laquelle vous obtenez 1023 octets de mémoire libre est purement parce que le malloc (sur 1023 - qui est - 1024) réussit au premier essai. Cela signifie que vous avez au moins 1023 octets de mémoire - mais ne vous dit pas la vraie mémoire disponible.

Avant cela, vous devez avoir quelque chose qui garde la mémoire. Ma conjecture est la classe GSM ici - il 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 la mémoire complète du tampon.

Quelle est la taille de votre commande? Je suppose que c'est (ou l'ensemble complet) est probablement autour de 700 octets ...

+0

En fait, cmdd est un tableau de caractères (une chaîne, si vous le pouvez) de 14 caractères. Donc, fondamentalement, il y a beaucoup d'autres variables non associées à cmd. SRAM disponible maximum est 1kb, donc en effet je suppose que j'ai environ 700 octets de données. Existe-t-il un moyen d'obtenir la vraie mémoire disponible? Après NewRoutine(), à chaque fois que j'appelle d'autres fonctions, availableMemory renvoie toujours 1023. –

+0

endl est à la fois "\ n" et flush() utilisant des ostreams C++ STL - peut-être la même chose ici. La mise en mémoire tampon semble être une cause probable d'utilisation de la mémoire «étrange» ou de délais de sortie –

+0

@Mike: Avez-vous essayé, juste pour les grins, de voir ce qui se passe lorsque vous allouez> 1023 octets? Avez-vous vérifié qu'il échoue correctement? –

0

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

+0

Vous avez raison, c'est sur le tas parce que l'accès à la variable cmdd prend du temps. Donc, je l'assigne loin avant que j'en ai vraiment besoin - donc c'est sur le tas. –

Questions connexes