- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Nach ISR in beliebige Funktion springen? Wie? Inline-Asm?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.11.2008
    Alter
    33
    Beiträge
    60

    Nach ISR in beliebige Funktion springen? Wie? Inline-Asm?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo liebe RN-Community

    Ich habe eine Frage bezüglich ISRs.
    Ist es möglich nach dem ausführen einer ISR an eine andere Stelle im Code (an den anfang einer Methode) zu springen, sodass nicht da weitergemacht wird, wo die ISR aufgerufen wurde.

    Es würde mir schon reichen, wenn an den Anfang der Methode gesprungen würde, in der die ISR aufgerufen wurde.

    Muss ich dazu den Epilog der ISR verändern? bzw Wie? Mit Inline-Assembler?

    Könnte mir jemand evtl. ein bisschen Beispielcode posten und ggf. kurz erläutern? Das wäre echt super!


    Ich poste hier noch meinen code:
    Es geht darum, dass nach "ISR(INT0_vect)" bzw "ISR(INT1_vect)" wieder zum Anfang der Funktion "mainLoop()" gesprungen wird.

    Vielen Dank schonmal im Vorraus - ich hoffe dass mir wer helfen kann...

    einen schönen Abend noch euch allen

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man kann an viel stellen springen. Vielleicht sogar ohne ASM mit Goto. Allerdings wird fast jeder sprung den Stack durcheinanderbringen. Das einzige was noch einigermaßen geht ist zum Reset zu springen und komlett neu zu Starten, allerdings mit den alten Werten in den globalen Variablen, sofern die nicht initialisiert werden.

    Man wird da schon in der main loop ein flag abfragen müssen, das dann in der ISR gesetzt wird.

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Besserwessi
    Das einzige was noch einigermaßen geht ist zum Reset zu springen und komlett neu zu Starten, allerdings mit den alten Werten in den globalen Variablen, sofern die nicht initialisiert werden.
    Bei einem Sprung zum Resetvector wird der gleiche C-Startup-Code ausgeführt, wie bei einem "echten" Reset. Bezüglich der C-Umgebung macht das absolut keinen Unterschied, also hat man nicht die alten Werte in den globalen Variablen (außer natürlich man hat sie explizit in die noinit-Section gelegt). Es macht allerdings einen Unterschied bei den Hardware-Registern.
    MfG
    Stefan

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Hallo Manu,

    hast du es schon mal mit longjmp / setjmp versucht? Sollte rein theoretisch funktionieren. Ansonsten bleibt wohl nur der Weg über die Abfrage eines Flags in der mainLoop wie Besserwessi schon geschrieben hat oder Du musst die Software anders designen, sodass das Problem garnicht mehr auftritt. Was wird in der mainLoop eigentlich gemacht, dass sie nach dem Interrupt unbedingt von vorne anfangen soll?

    MfG Mark

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Moin Leute,

    Besserwesi hat es doch schon gesagt: Man kann zwar springen, aber der Stack wird in kürzester Zeit überlaufen, weil er im ISR nur gefüllt wird, aber nie mehr geleert.

    Da muss man genau aufpassen, was man tut, ansonsten hat man ruck zuck ein Programm das immer nur sehr kurze Zeit läuft und dann abstürzt.

    Ich würde mir auf jedne Fall eine andere Lösung überlegen. Dafür sind ISR nicht gedacht und ausgelegt. Das Flag ist z.B. eine gute Lösung.

    Viele Grüße
    Andreas

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.11.2008
    Alter
    33
    Beiträge
    60
    die mainLoop ist igg. nur die "Endlosschleife" in der main - ich hab das lediglich in eine extra Funktion gepackt, um einen Anhaltspunkt beim "Springen" zu haben.
    Dass der Stack überläuft und sich das ganze aufhängt, wenn man einfach mainLoop() am ende der ISR aufruft, hab ich mir gedacht und auch schon feststellen müssen :/

    ja ich werde wohl um Flags im mainloop nicht drumrumkommen und "anders designen" kann ich das programm leider auch nicht an dieser Stelle... ich hab mir gestern Nacht im Bett jedoch schon ein Paar Gedanken gemacht, wie ich dies am schönsten umsetzen könnte...

    Es soll dann nach JEDEM ausgeführten Befehl ein Check ausgeführt werden und ich glaube mit einer switch Verzweigung in einer Schleife sollte sich sowas am schönsten umsetzen lassen

    Code:
    mainLoop()
    {
      xyz...
      for(int i = 1; i <= 3; i++)
      {
        checkFlags();
        switch(i)
        {
          case 1: Befehl1;
                      break;
          case 2: Befehl2;
                      break;
          case 3: Befehl3;
                      break;
         }
      }
    }
    Was haltet ihr davon?

    Danke übrigens an alle, die bisher auf meine Frage geantwortet haben

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    44
    Beiträge
    689
    Warum nicht in der ISR den Stack-Pointer manipulieren so das der Rücksprung an ne andere Stelle erfolgt. Nun muß man nur noch rausbekommen was C alles in den Stack schmeißt in der ISR.
    Signatur??? kann ich mir nicht leisten!!!

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    24.11.2008
    Alter
    33
    Beiträge
    60
    ja gut, ungefähr so hatte ich mir das igg. vorgestellt...
    nur weiß ich leider auch nicht, wie ich das anstellen sollte

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Rofo88
    Warum nicht in der ISR den Stack-Pointer manipulieren so das der Rücksprung an ne andere Stelle erfolgt. Nun muß man nur noch rausbekommen was C alles in den Stack schmeißt in der ISR.
    Untauglich. Man hat dann immer noch den "Müll" auf dem Stack von der Funktion, die durch die ISR unterbrochen wurde, und von der Funktion in der die unterbrochene Funktion aufgerufen wurde, und von deren "Mutterfunktion", und von ...
    MfG
    Stefan

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    24.11.2008
    Alter
    33
    Beiträge
    60
    wirklich? wird die isr nicht normal beendet, der speicher freigegeben und anschließend zur manipulierten Rücksprungadresse gegangen?

    http://www.hs-augsburg.de/~sandman/c...002C271F04F1B1

    wird das ganz nett beschrieben, wie das machbar sein sollte:
    Man nimmt die Adresse des ersten Parameters (Bei ISR leider nicht vorhanden... gibts da Alternativen?) und geht 1 Byte zurück und schon hat man einen Zeiger auf die Rücksprungadresse.

    Aber nungut... wenn diese Methode untauglich ist, dann will ich dir das mal glauben - ich komm eigentlich aus der Java Ecke und bin deshalb nicht so fit im Umgang mit Speicheroperationen etc...

    Schönen Dank euch allen

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test