warten auf Rückgabewert

Gast #936376
Lesenswert?

Hallo,

ich habe folgendes Problem zu dem mir einfach keine Lösung einfallen 
will:

Ich habe in meinem Programm eine Endlosschleife laufen, diese arbeitet 
zyklisch Methoden ab wenn die dazugehörigen Flags gesetzt sind.

Über Interrupts werden verschiedene Methoden gestartet, die jeweils ihre 
Flag setzen und dann darauf warten sollen, dass die Endlosschleife die 
dazugehörige Methode abarbeitet.

also im Prinzip:

int a;

interrupt1()
{
  methode1();
}

while(1){
  if(flag1){
    a=rechnung();
  }
}

methode1(){
   flag1=1;
   .....
   return a;
}

Das Problem ist folgendes: Woher weiss ich das der Wert in der 
Endlosschleife berechnet wurde? Ich müsste ja so lange warten (da wo die 
Punkte sind), ich habe allerdings keine Ahnung wie ich das machen soll 
ohne die Ausführung der while-Schleife zu behindern. Vielleicht mach ich 
das auch alles grad viel zu kompliziert als es ist und hab in dem Fall 
nur noch Tunnelblick....

Hoffe jemand hat eine Idee,

Helmi
Gast #936402
Lesenswert?

Warum willst du in der Interruptroutine auf etwas warten, was im
Hauptprogramm (also in der While-Schleife) passiert? Das gibt
garantiert einen Deadlock, weil die Interruptroutine die Ausführung
des Hauptprogramms blockiert und sie deswegen ewig warten müsste.

Was immer die Interruptroutine mit dem Ergebnis a der Berechnung im
Hauptprogramm tun würde, kann doch auch im Hauptprogramm nach der
Zeile "a=rechnung()" erfolgen. Die Interruptroutine setzt also nur
noch das Flag, was sehr schnell geht, und behindert damit den Ablauf
im Hauptprogramm kaum.
Gast #936427
Lesenswert?

ich sehe das wie yalu.
Du hast 2 Möglichkeiten
- in der Interruptroutine die Berechnung zu machen
mit der Gefahr, dass es eventuell zu lange dauert

- in ISR flag setzen
Berechnung aus der while starten und was sich
aus der Berechnung ergibt auch gleich ausführen.
Also das was du in der ISR danach ausführen wolltest.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren