Stack erhöhen ...
Hallo,
ich habe eine kleine Schaltung mit einem Mega8 gebaut, die aus einem Medizinischen Gerät Daten auslesen soll. Funktioniert auch alles ganz gut, nur leider bricht die Verbindung in Regelmäßigen Abständen ab, und der Mega8 führt eine Art Reset durch. Nach langem suchen, bin ich darauf gekommen, das es an folgendem Code liegt. Das ist ein Beispielcode auf den ich den Fehler zurückführen konnte. Es scheint so, als ob es etwas mit dem Stack zu tun hat, aber ich bin nicht Crack genug um genau zu wissen warum es passiert und vor allem was ich dagegen tun kann.
Dieser Code ist nur ein Beispiel, das das gleiche Verhalten aufweist wie mein Original Code. Hat jemand eine Idee wie ich das Resetten des Mega8 verhindern kann.Code:$regfile = "m8def.dat" $crystal = 16000000 $baud = 38400 $hwstack = 32 $swstack = 8 $framesize = 16 Dim I As Integer Declare Sub Test_a Declare Sub Test_b I = 0 Print "Start" Test_a Sub Test_a Incr I Print I Waitms 50 Test_b End Sub Sub Test_b Waitms 50 Test_a End Sub
Danke schon mal für alle Tips und Ideen
Gruß Frank
Stack erhöhen ...
Erstmal, wofür den Originalcode wenn der Beispielcode das gleiche Ergebnis hat und zweitens habe ich ja geschrieben, das es meiner Meinung nach mit dem Stack zu tun hat. Wenn ich ihn verändere, passiert der Reset zu einem anderen Zeitpunkt, aber er passiert doch. Vermutlich liegt es daran, das beim gegenseitigen Aufrufen der Subs, der Stack nicht wieder freigegeben wird. Es muss doch aber eine Möglichkeit geben dies manuell zu tun. Oder eine andere Möglichkeit des gegenseitgen aufrufens.
Gruß Frank
Das muss zwangsläufig zum Crash führen, da sich die SUBs Test_A und Test_B ja permanent gegenseitig aurufen. Mit jedem Ausruf, wird die Rücksprungadresse auf den HW-Stack geschrieben und normalerweise bein Verlassen der SUB wieder von dort gelöscht.
In Deinem Konstrukt kommt es aber gar nicht dazu, da zwar immer eine weitere SUB aufgerufen wird, aber kein Rücksprung stattfindet.
Ich empfehle Dir, die Programmlogik zu überdenken.
Viele Grüße
Josef
-------------------------------------------------------------------------------------
DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel
Könnte man das nicht mit der Hauptschleife verbinden.
Danach am Ende jeden Sub's ein Return, sodass es nicht immer ein Stack tiefer rutscht?
Ohne gegenseitiges Aufrufen funktioniert es ohne Probleme. Ich schreibe das Programm nochmal um, und nehme die Auswertung dann jetzt etwas anders vor.
Ich dachte nur, es gäbe eine einfache Möglichkeit den Stack zu "reinigen"
Gruß Frank
Wenn du die Aufruftiefe nicht beschränkst, nutzt dir Hack wie "Stack von Hand zu reinigen" auch nix. Momentan ist's so wie ne Funktion, die sich endlos selber aufruft, aber nie zurückkehrt...
Disclaimer: none. Sue me.
Nach Aufruf der Unterfunktionen und Subs muß das Programm wieder in die Hauptschleife springen da wie schon gesagt sonst der Stack automatisch hochgezählt wird und die Rücksprungadresse nicht gelöscht wird. Nach ein paar µS ist der Stack voll, egal wie hoch du ihn setzt.
Eine Verschachtelung der Unterfunktionen ist natürlich möglich und auch üblich, jedoch mußt du selbst wissen wie weit du die Funktionen ineinander verschachteln willst. So kannst du ungefähr die Stackgröße definieren.
MFG
Bertl
So, ich habe das Programm umgeschrieben und nun funktioniert alles wie gewünscht. Danke für alle Tips
Gruß Frank
Lesezeichen