2017-02-25 38 views
2

私はMD5ライブラリでArduinoメガを使用していて、SoftwareSerialでESP8266を使用しています。問題は、370回のループの後で、メモリ不足のためにArduinoが自動的に再起動することです。トラブルシューティングにFreeMemoryを使用しましたが、問題は各ループで使用可能なメモリが減少していることに気付きました。私はMD5と一緒にATコマンドを使用するときにのみ表示されるので、それは奇妙な動作ですが、2つのスケッチでスケッチを分離すると、メモリの問題なく正しく動作します。 私の元のスケッチはかなり複雑ですが、より明確にするために例文に示されている必須のコードに還元されました。その振る舞いは同じです。私はそれを修正すれば私の元のスケッチを修正できますArduinoは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()); 

} 

ありがとうございます!ここで

+1

あなたは 'hash'変数も自由である必要はありませんか? – MrEricSir

+0

そうなっていますか?あとでもう一度必要とする場合に備えて、割り当てられたメモリをぶら下げておくことはできませんか? – user4581301

答えて

4

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; 
} 

あなたが見ることができるように、返さhash変数のためにそこにmalloc()があります。したがって、各ループの最後にfree(hash)を呼び出す必要があります。あなたの周りhashを維持する必要がある場合は

、それはグローバルスコープに入れ、一度だけsetup()機能でそれを作成します。

+1

ありがとう!次回は、図書館のソースコードを見ていきたいと思います。 – Victor

関連する問題