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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top