Forum: Mikrocontroller und Digitale Elektronik kurioser Reset durch Leerzeichen oder Funktionsaufruf


von Alex V. (alex_)


Lesenswert?

Hallo ihr da draußen,

ich bin vor ein paar Stunden auf einen Fehler gestoßen der mich sehr 
verwunder. Folgender Aufruf wird von meinem Atmega328 normal 
abgearbeitet
1
Serial.println(" test ");

und dieser Aufruf, ohne Leerzeichen hinter dem "test" führt zu einem 
Reset
1
Serial.println(" test");

"Serial" gehört zu den Standard Arduino Funktionen.

Wenn ich an der selben Stelle in der Software eine Funktion einer 
anderen Klasse aufrufe, führt auch das zu einem Reset.


Folgende Funktion sagt, das mir vor dem Aufruf noch 1400 Bit zu 
Verfügung stehen.
1
 int availableMemory() {
2
  int size = 2048;
3
  byte *buf;
4
5
  while ((buf = (byte *) malloc(--size)) == NULL)
6
    ;
7
8
  free(buf);
9
10
  return size;
11
12
 }


Ich frage mich jetzt was alles zu einem Reset führen kann, bzw. wie ich 
am besten auf den Fehler kommen kann. Ich habe eine Verschachtelte 
Klassen Struktur. Der Aufruf befindet sich in der vierten Ebene, ich 
kann mir denken das verschachtelte Klassen nicht die beste Struktur auf 
einem µC sind, kann das alleine schon der Grund für den Crash sein?.

Das ganze läuft auf einem Arduino Uno. Als IDE teste ich gerade Visual 
Studio mit dem Visual Micro Plugin sowie den Arduino Libraries, bin mir 
aber nicht so sicher ob das der goldene Weg ist.


Gute Nacht,

Alex.

von katombo (Gast)


Lesenswert?

schon mal geschaut wie viel Flash du noch frei hast?

von Klaus W. (mfgkw)


Lesenswert?

Alex V. schrieb:
> 1400 Bit

Bit?

Was macht dein availableMemory() eigentlich, enn es gar keinen Speicher 
mehr gibt?

von µC-Bastler (Gast)


Lesenswert?

Hast du deinem Programmablauf schonmal im Simulator über die Finger 
geschaut? Das sollte klären helfen, was da los ist.

von Alex V. (alex_)


Lesenswert?

@katombo: Wenn ich es richtig verstanden habe, dann hat der Atmega328 3 
verschieden Speicher Typen:

SRAM: 2 Kbyte - hier das laufende Programm ausgeführt, dieser Teil wird 
von availableMemory() gecheckt. Hier habe ich aber wie gesagt noch 1,4 
Kbyte.

EEPROM: 1 Kbyte - für Settings,vom Programm erzeugte Daten usw. nutze 
ich momentan nicht

Flash: 32 Kbyte ist das ausführbare Programm abgelegt. Bei mir momentan 
knapp 8 Kbyte.

Ich denke die Menge an Speicher ist nicht das Problem, ich denke eher an 
ein Fehler im Code.

@Klaus Wachtler: ich weiß nicht was availableMemory()tut, sollte kein 
freien speicher mehr vorhanden sein, ich weiß auf dem Weg nur, dass ich 
tendenziell noch genug haben sollte.  (Bit sind falsch, ich wollte Byte 
geschrieben haben. :) )

@µC-Bastler: Simulator kling gut, ich habe bis lang immer direkt auf dem 
board debugt, im dem ich mir der Serieller Schnittstelle bestimmte 
Positionen im Ablauf überprüft habe. Was ist denn das Tool der Wahl zum 
simulieren? Werde mir mal  AVR Studio 5 anschauen, da ist alles mit an 
Board, richtig? Habt ihr Erfahrung mit Arduino und AVR Studio 5?

Netter Gruß,

Alex.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.