PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gegeseitiges Aufrufen von Subs führt zu Reset



frank-wob
01.09.2006, 12:26
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.



$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


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.

Danke schon mal für alle Tips und Ideen

Gruß Frank

Hanni
01.09.2006, 12:47
Stack erhöhen ...

frank-wob
01.09.2006, 12:53
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

oe9vfj
01.09.2006, 13:06
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.

Reeper
01.09.2006, 13:21
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?

frank-wob
01.09.2006, 13:32
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

SprinterSB
01.09.2006, 14:24
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...

bertl100
01.09.2006, 21:06
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

frank-wob
01.09.2006, 21:55
So, ich habe das Programm umgeschrieben und nun funktioniert alles wie gewünscht. Danke für alle Tips

Gruß Frank