- LiFePO4 Speicher Test         
Ergebnis 1 bis 9 von 9

Thema: Gegeseitiges Aufrufen von Subs führt zu Reset

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.04.2006
    Beiträge
    48

    Gegeseitiges Aufrufen von Subs führt zu Reset

    Anzeige

    Praxistest und DIY Projekte
    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.

    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
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Stack erhöhen ...

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    06.04.2006
    Beiträge
    48
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    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

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    40
    Beiträge
    685
    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?

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    06.04.2006
    Beiträge
    48
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    44
    Beiträge
    464
    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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    06.04.2006
    Beiträge
    48
    So, ich habe das Programm umgeschrieben und nun funktioniert alles wie gewünscht. Danke für alle Tips

    Gruß Frank

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress