Я использую Arduino Mega с библиотекой MD5 и ESP8266 с SoftwareSerial. Проблема в том, что после 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()
функция.
Других решений пока нет …