2017-02-25 446 views
2

我正在使用带有SoftwareSerial的MD5库和ESP8266的Arduino mega。问题是370循环后,由于内存不足,Arduino自动重启。我使用FreeMemory进行故障排除,我注意到问题在于每个循环的可用内存减少。这是奇怪的行为,因为它只在我使用AT命令和MD5时才会出现,但是如果我在两个草图中分离草图,它们可以正常工作而不会出现内存问题。 我的原始草图是一个相当复杂的,但我减少到基本的代码示例显示波纹管为了更清晰,行为是相同的,所以如果我修复它,我将能够修复我原来的草图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'变量不需要free'd吗? – 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; 
} 

正如你所看到的,有在那里malloc()为返回hash变量。因此,您应该在每次循环迭代结束时调用free(hash)

如果你需要保持hash各地,把它放在全球范围内只有一次在setup()函数创建

+1

谢谢!下次我会记住看看库源代码。 – Victor