2017-02-25 1 views
2

J'utilise Arduino mega avec la bibliothèque MD5 et ESP8266 avec SoftwareSerial. Le problème est que, après 370 boucles, Arduino redémarrage automatique en raison du manque de mémoire. J'ai utilisé FreeMemory pour résoudre les problèmes, j'ai remarqué que le problème est la diminution de la mémoire disponible à chaque boucle. C'est un comportement bizarre, car il n'apparaît que lorsque j'utilise des commandes AT avec MD5, mais si je sépare l'esquisse dans deux croquis, ils fonctionnent correctement sans problèmes de mémoire. Mon croquis original est un peu plus complexe, mais j'ai réduit au code essentiel l'exemple montré ci-dessous pour être plus clair, le comportement est le même, donc si je le répare je serai capable de réparer mon croquis originalArduino ne libère pas la mémoire RAM

#include <SoftwareSerial.h> 
#include <MemoryFree.h> 
#include <MD5.h> 


void setup() { 
    // initialize the digital pin as an output. 
    Serial.begin(115200); 
    Serial.println("Starting"); 
    Serial1.begin(115200); 
    delay(200); 
} 

// the loop routine runs over and over again forever: 
void loop() { 

    Serial1.println("AT"); 
    delay(100); 
    Serial.println(Serial1.readString()); 
    Serial.println("-----------"); 

    unsigned char* hash=MD5::make_hash("hello world, this an example"); 
    //generate the digest (hex encoding) of our hash 
    char *md5str = MD5::make_digest(hash, 16); 
    //print it on our serial monitor 
    Serial.println(md5str); 
    //Give the Memory back to the System if you run the md5 Hash generation in a loop 
    free(md5str); 
    Serial.println(freeMemory()); 

} 

Merci!

+1

Etes-vous sûr que la variable 'hash' n'a pas besoin d'être libérée aussi? – MrEricSir

+0

Est-ce censé? Ne peut-il pas conserver cette mémoire allouée au cas où elle en aurait besoin plus tard? – user4581301

Répondre

4

Voici le code source de make_hash:

unsigned char* MD5::make_hash(const void *arg) 
{ 
    MD5_CTX context; 
    unsigned char * hash = (unsigned char *) malloc(BLOCK_SIZE); 
    MD5Init(&context); 
    MD5Update(&context, arg, strlen((char*)arg)); 
    MD5Final(hash, &context); 
    return hash; 
} 

Comme vous pouvez le voir, il y a une malloc() là-dedans pour la variable de retour hash. Par conséquent, vous devez appeler free(hash) à la fin de chaque itération de boucle.

Si vous devez garder hash autour, mettre dans la portée globale et le créer une seule fois dans la fonction setup().

+1

Merci! la prochaine fois je garderai à l'esprit jeter un oeil au code source de la bibliothèque. – Victor