Problema de memória c/c ++?
-
10-07-2019 - |
Pergunta
Programação para o meu Arduino (em algum tipo de mistura de C/C ++), notei algo estranho.
Toda vez que me comunico através da porta serial, fico de olho no uso do SRAM. Normalmente, ele varia entre 300 ~ 400 bytes. No entanto, depois de adicionar uma nova rotina (veja abaixo), notei que sempre saltou de 300 ~ 400 bytes de memória livre para EXATAMENTE 1023. Meu palpite é que há um problema.
Esta é a nova rotina
void NewRoutine(char *cmdd){
GSM.print(cmdd);
GSM.print(26, BYTE);
GSM.print(endl); // <-- added later
Serial.print(availableMemory());
}
E esta é a rotina da MemoryCheck
int availableMemory() {
int size = 1024;
byte *buf;
while ((buf = (byte *) malloc(--size)) == NULL);
free(buf);
return size;
}
Observe isso: primeiro, não funcionou. Depois que adicionei o comando endl, ele funcionou magicamente, mas então notei o problema da memória.
Alguém tem idéias para uma solução alternativa?
Solução
A razão pela qual você está recebendo 1023 bytes de memória livre é apenas porque o Malloc (em 1023 -que é - -1024) está conseguindo na primeira tentativa. Isso significa que você tem pelo menos 1023 bytes de memória - mas não diz a verdadeira memória disponível.
Antes disso, você deve ter algo mantendo a memória por perto. Meu palpite é a classe GSM aqui - provavelmente contém os dados (CMDD + 26) em um buffer interno que é liberado em uma nova linha. Assim que você adicionou sua chamada ENDL, você provavelmente está recuperando a memória completa do buffer.
Qual é o tamanho do seu comando? Meu palpite é que ele (ou o conjunto completo deles) é provavelmente em torno de 700 bytes ...
Outras dicas
Talvez ele mantenha um buffer na pilha para transferir dados para a porta serial?