Frage

Programmierung für meinen Arduino (in einer Art Mischung aus C / C ++), bemerkte ich etwas seltsam.

Jedesmal, wenn ich über die serielle Schnittstelle kommunizieren, halte ich ein Auge auf der SRAM-Nutzung. Normalerweise ist es im Bereich zwischen 300 ~ 400 Bytes. Doch nach einer neuen Routine Zugabe (siehe unten), bemerkte ich es immer von 300 ~ 400 MB freien Speicher sprang auf GENAU 1023 Meine Vermutung ist, dass es ein Problem gibt.

Dies ist die neue Routine

void NewRoutine(char *cmdd){

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

Und das ist die MemoryCheck Routine

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

Bitte beachten: Erstens, es hat nicht funktioniert. Nachdem ich den Endl Befehl hinzugefügt, es hat funktioniert magisch, aber dann bemerkte ich das Speicherproblem.

Wer hat Ideen für eine Abhilfe?

War es hilfreich?

Lösung

Der Grund, Sie bekommen 1023 Bytes freien Speichers ist rein, weil die malloc (auf 1023 - die --1024 ist) auf dem ersten Versuch gelingt. Dies bedeutet, dass Sie mindestens 1023 Byte Speicher haben -. Sie jedoch nicht die wahren verfügbaren Speicher sagt

Vor dieser Zeit müssen Sie um etwas zu halten Gedächtnis gehabt haben. Meine Vermutung ist, die GSM-Klasse hier - es ist wahrscheinlich die Daten (CMDD + 26) in einem internen Puffer hält, die auf einem Newline gespült wird. Sobald Sie Ihren Endl Anruf hinzugefügt, sind Sie wahrscheinlich den vollen Speicher zurück aus dem Puffer erhalten.

Wie groß ist Ihr Befehl? Meine Vermutung ist, dass es (oder der volle Satz von ihnen) ist wahrscheinlich etwa 700 Bytes ...

Andere Tipps

Vielleicht hält es einen Puffer auf dem Heap Daten an die serielle Schnittstelle zu übertragen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top