- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 16

Thema: Mittels goto an Programmanfang springen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    da weiß ich dann recht genau, was ich tue . . . denn bekanntlich tut der Computer/Controller immer das was man ihm sagt, das ist aber nicht immer das, was man meint, ihm gesagt zu haben.
    das hast du schön gesagt.

    Also was ich genau vor habe ist, wenn ein bestimmter Befehl über die UART rein kommt, soll der µC an den Anfang des Programmes springen (aus der Hauptschleife raus) und sein Programm von vorne anfangen ohne komplett neu gestartet zu werden. Da vor der Hauptschleife einmalig ein paar Berechnungen stattfinden. Dazu müsste ich ein paar Variablen zurücksetzen und eben auf den besagten Punkt springen. Ich denke so ein "Softwarereset" müsste doch ohne Probleme mittels einer Routine zum Richten der Variablen und der Verzweigung auf einen Einstigespunkt möglich sein oder?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Es dürfte wohl kein Problem sein, mittels eines GOTO vor die Deklaration der Variablen zu springen.

    Was passiert mit den Variablen wenn sie neu erstellt werden? Sie müssten doch dann alle wieder unbeschrieben sein oder?
    Das kann man wunderschön im Simulator testen! Ich habe es gerade versucht, und die Variablen bleiben absolut unverändert! Sie durch erneutes Deklarieren auf 0 zu setzen, funktioniert wenigstens in der Simulation nicht.

    Da wirst Du wohl um eine Rücksetz-Routine nicht herumkommen...

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Wenn UART Empfang nicht in der Hauptschleife ausgewertet wird, passen die Werte auf dem Stack nicht. Irgendwann wird dieser dann überlaufen.
    Ich würde für die Berechnungen am Anfang des Programmes eine Sub erstellen und diese dann nach dem bestimmten UART Befehl aufrufen.

    Goto 0 springt an den Anfang des Programmes (Adresse 0). Dort wird normal auch alles neu initialisiert. Aber so weit wolltest Du ja nicht zurückspringen. Ich nutze für einen Reset
    immer den Watchdog. Einfach einschalten und dann ein do:loop hinterher und der AVR startet neu.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Zitat Zitat von demmy Beitrag anzeigen
    ... Da vor der Hauptschleife einmalig ein paar Berechnungen stattfinden ...
    Die doofe Bemerkung vorneweg: ich kenn mich mit Bascom nicht aus, ich programmiere in C, sehr selten in Assembler. Ne Vermutung hinterher: kann es sein, dass es bei Bascom Direktiven für den Präprozessor gibt (den Präprozessor müssts doch da auch geben)?

    Feststellung: Wenn ich vorneweg EINMALIG ein paar Berechnungen anstelle, dann nenne ich diese Werte ("... ein paar Variablen zurücksetzen ...") aber KONSTANTEN. Diese Berechnungen lasse ich dann nach Möglichkeit vom Präprozessor erledigen, das spart Programmspeicher. Auch wenn Programmspeicherplätze bei mir selten ein Problem sind. Und ne Konstante muss ja nicht online oder im Controller berechnet werden. WENN sie neu berechnet würde - dann müssten sich doch die Gegebenheiten ändern/geändert haben . . . oder versteh ich da was falsch?

    Nochne Vermutung: kann es sein, dass es bei Dir garnicht um Berechnungen im Controller geht - sondern im Präprozessor? Irgendwie sind solche Fragereien gelegentlich mit eher nicht vollständiger oder unklarer oder .... Problembeschreibung verbunden.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    51
    Beiträge
    2.253
    Man kann mit Goto 0 an den Programmanfang springen und wenn das NOINIT nicht gesetzt ist werden dann auch die Variablen auf Null gesetzt, aber, es hat ja einen Grund warum Du das Programm neu starten willst, eine Fehlfunktion z.B. und es werden eben nur die Varablen neu gesetzt, der Stack bleibt. Wenn Dein Programmfehler in nem Überlauf besteht, dann geht das so in einem fort
    Besser ist es einen kompletten Reset durchzuführen, auch für die Peripherie, sprich, zum Einen per Watchdog einen Reset herbeiführen und in der Startroutine Deines Programmes z.B. nen externen AD-Wandler vor der Initialisierung zu resetten.
    Der Vorteil ist auch, dass ggf. ein Bootloader dann ausgeführt werden kann für Firmwareupdates, da der noch vor dem Programmstart ausgeführt wird.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    348
    Hi zusammen,
    nein nein, es handelt sich nicht um eine Fehlfunktion oder ähnliches. Es ist etwas komplizierter das hier zu erklären und würde sicher den Rahmen hier sprengen.

    Bei der Problematik mit den Konstanten / Variablen gebe ich dir nur bedingt recht. Wenn es sich um Konstanten handelt, dann hätte ich sie auch so bezeichnet. In Wirklichkeit sind es aber Variablen, deren Startwert berechnet wird, die dann aber im laufenden Programm überschrieben werden.

    Ich habe es jetzt so gelöst, das ich mittels goto an einen definierten Startpunkt springe, da vor diesem Startpunkt noch Verzögerungszeiten / Wartezeiten / Berechnungen usw. ausgeführt werden. Die wirklich nur bei einem kompletten neustart des Systems einmalig benötigt werden um angeschlossene , ich bezeichne sie jetzt mal als "Pheripherie" zu Initialisieren bzw. Ihr Zeit zum Anlaufen zu geben.

    Was ich erreichen wollte ist im Prinzip nur ein simpler "Softwarereset", wo an einem definierten Punkt wieder neu ins Programm eingesprungen wird.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Also ich hätte nichts dagegen obwohl ich versuchen würde es anders zu lösen Der Sprung mit GOTO sollte nur nicht aus einem Unterprogramm oder gar einer Interruptroutine heraus erfolgen, da sonst der Stack durcheinanderkommt.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    ... nichts dagegen obwohl ich versuchen würde es anders zu lösen . Der Sprung mit GOTO ...
    Sowohl in meinem recht komplexen Transistortester - ähnlich hier, aber mit I 2 C und weiteren, eigenen Funktionen - als auch in meinem Pacer (hier) habe ich GOTO´s. Der Pacer läuft mit sleep - und ich habe eigentlich noch nie nen Absturz erlebt. Der Transitortester wird zwar immer neu gestartet, aber auch hier ist bei längerem, durchgehenden Gebrauch kein Nachteil zu erkennen - und keine Fehlfunktion.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    @oberallgeier: Ich habe ja auch gar nichts gegen die Nutzung von Goto. Mir ging es darum, daß man auf den Stackpointer achten sollte und bei Sprung aus einer ISR heraus auch noch auf das Global Interrupt Enable Bit. Das könnte kompliziert werden und kann man vermeiden, wenn man Goto vermeidet oder es nur innerhalb des Hauptprogramms verwendet bzw. nur innerhalb von Subroutinen springt.

    zB bei sowas wird der Stackpointer immer weiter nach unten gesetzt und es muß irgendwann zum crash kommen.
    Code:
    dim x as byte
    dim y as byte
    
    init:
    x = 1
    y = 2
    
    gosub check
    
    do
    loop
    
    check:
      if x = 1 goto init
    return
    
    end
    Steht anstelle von "goto init" ein "goto 0" wird auch der Stackpointer neu initialisiert.
    Ist halt eine Frage der Konstellation und wie Demmy es einsetzt.

    Gruß
    Searcher
    Geändert von Searcher (30.11.2012 um 11:35 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. An bestimmte Programmstelle springen
    Von petzi-- im Forum Robby RP6
    Antworten: 12
    Letzter Beitrag: 17.10.2012, 19:56
  2. if then else Schleife möglich mit goto zu verlassen?
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 27
    Letzter Beitrag: 14.04.2009, 09:17
  3. Bootloader goto addresse bei Mega644 ?
    Von Keksdose im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 01.04.2007, 19:09
  4. goto ist böse
    Von _maddin im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 11.02.2007, 16:58
  5. Frage zu Goto und Return
    Von Murus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 20.04.2006, 11:28

Berechtigungen

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

12V Akku bauen