Arduino 没有释放 RAM 内存
Arduino is not freeing up RAM memory
我正在使用带有 MD5 库的 Arduino mega 和带有 SoftwareSerial 的 ESP8266。问题是在 370 次循环后,Arduino 由于内存不足而自动重启。我使用 FreeMemory 进行故障排除,我注意到问题是每个循环的可用内存都在减少。这是一种奇怪的行为,因为它仅在我将 AT 命令与 MD5 一起使用时出现,但是如果我将草图分成两个草图,它们可以正常工作而不会出现内存问题。
我的原始草图相当复杂,但为了更清楚,我将示例显示为下面的基本代码,行为是相同的,所以如果我修复它,我将能够修复我的原始草图
#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());
}
谢谢!
这里是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()
函数。
我正在使用带有 MD5 库的 Arduino mega 和带有 SoftwareSerial 的 ESP8266。问题是在 370 次循环后,Arduino 由于内存不足而自动重启。我使用 FreeMemory 进行故障排除,我注意到问题是每个循环的可用内存都在减少。这是一种奇怪的行为,因为它仅在我将 AT 命令与 MD5 一起使用时出现,但是如果我将草图分成两个草图,它们可以正常工作而不会出现内存问题。 我的原始草图相当复杂,但为了更清楚,我将示例显示为下面的基本代码,行为是相同的,所以如果我修复它,我将能够修复我的原始草图
#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());
}
谢谢!
这里是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()
函数。