Domanda

Programmando per il mio Arduino (in una sorta di mix di C / C ++), ho notato qualcosa di strano.

Ogni volta che comunico attraverso la porta seriale, tengo d'occhio l'utilizzo della SRAM. Normalmente, varia tra 300 ~ 400 byte. Tuttavia, dopo aver aggiunto una nuova routine (vedi sotto), ho notato che saltava sempre da 300 ~ 400 byte di memoria libera a ESATTAMENTE 1023. Il mio sospetto è che ci sia un problema.

Questa è la nuova routine

void NewRoutine(char *cmdd){

   GSM.print(cmdd);
   GSM.print(26, BYTE);
   GSM.print(endl); // <-- added later
   Serial.print(availableMemory());
}

E questa è la routine MemoryCheck

  int availableMemory() {
  int size = 1024;
  byte *buf;
  while ((buf = (byte *) malloc(--size)) == NULL);
  free(buf);
  return size;
}

Nota: in primo luogo, non ha funzionato. Dopo aver aggiunto il comando endl, ha funzionato magicamente, ma poi ho notato il problema di memoria.

Qualcuno ha idee per una soluzione alternativa?

È stato utile?

Soluzione

Il motivo per cui stai ottenendo 1023 byte di memoria libera è puramente perché il malloc (su 1023 - che è --1024) sta riuscendo al primo tentativo. Ciò significa che hai almeno 1023 byte di memoria, ma non ti dice la vera memoria disponibile.

Prima di questo, devi aver avuto qualcosa che ha tenuto la memoria in giro. La mia ipotesi è la classe GSM qui - probabilmente contiene i dati (cmdd + 26) in un buffer interno che viene scaricato su una nuova riga. Non appena hai aggiunto la tua chiamata endl, probabilmente stai recuperando tutta la memoria dal buffer.

Quanto è grande il tuo comando? La mia ipotesi è che (o il set completo di questi) sia probabilmente circa 700 byte ...

Altri suggerimenti

Forse contiene un buffer sull'heap per trasferire i dati alla porta seriale?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top