Forum: Compiler & IDEs Anti-Interrupt, oder so was in der Art.


von Andreas (Gast)


Lesenswert?

Servus zusammen,

ich habe folgende Idee und bin mir gerade nicht sicher ob man das in C 
überhaut oder vielleicht sogar in schön verwirklichen kann. Gleich 
vorab:
Ich suche jetzt nicht unbedingt fertige Lösungen, nur Ansätze oder ggf. 
Alternativlösungen oder tips wie man sowas schön programmieren kann.

Also, es dreht sich alles darum, dass ich ein paar Codezeilen habe, die 
mit mittlerer Priorität abgearbeitet werden sollen, die aber sehr viel 
und lange auf unterschiedliche Hardware wartet. Ein anderer 
Codeabschnitt läuft ohne derartige Warteschleifen, soll aber auch mit 
niedrigerer Priorität abgearbeitet werden. Nun ist meine Idee, anstatt 
langen while(...); wartereien, eher eine Funktion wie 
"resumeOnInterrupt()" einzufügen, die solange einen anderen Prozess 
laufen lässt, bis eben ein bestimmter Interrupt auftritt. Dann soll der 
Code nach dem Resume wieder ausgeführt werden. Wahrscheinlich geht das 
ganze ein wenig in Richtung mini-Betriebssystem. Meint ihr, das ist 
sinnvoll? Und habt ihr ne idee wie man sowas machen könnte? Den 
Prozesscounter in C auslesen dürfte ja relativ schwierig sein, aber im 
Interrupt wird er ja soweit ich weiß auf den Stack geladen, man müsste 
also nur in einem "naked"-Interrupt (dass, man auch weiß, was wo am 
Stack liegt) den Stack lesen und dort eben den PC des anderen Prozessen 
rein schreiben. Nach einem reti sollte ja dann der andere Prozess 
laufen. Natürlich sollte man dabei auch das Status-Register noch 
speichern und wiederherstellen.
Nur wie kann dann z.B. in einer "resumeOnInterrupt()"-Funktion ebenfalls 
den PC modifizieren?!

Ich hoffe ihr versteht was ich meine.
Was haltet ihr davon und könnt ihr mir Tips, Anregungen oder auch gern 
gemachte Fehler sagen?

Vielen Dank
Gruß Andreas

von Ralf G. (ralg)


Lesenswert?

Andreas schrieb:
> Ich hoffe ihr versteht was ich meine.

Nicht so richtig.
Das Programm geht doch sowieso an der Stelle weiter, an der es durch den 
Interrupt unterbrochen wurde. Die Interruptroutine hat sozusagen das 
"resumeOnInterrupt()" doch schon eingebaut!?

Andreas schrieb:
> Ein anderer
> Codeabschnitt läuft ohne derartige Warteschleifen, soll aber auch mit
> niedrigerer Priorität abgearbeitet werden.

Kommt jetzt darauf an, was dort gemacht wird. Evtl. lässt sich dieser 
Teil 'gelegentlich' als Funktion aufrufen.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Deine Grundidee ist schon nicht schlecht, aber die Art und Weise, wie Du 
sie umsetzen willst, etwas wirr formuliert.

Das Konzept, nach dem Du suchst, nennt sich Kooperatives Multitasking. 
Selbiges wurde bei M$ Windows vor Version 95 eingesetzt, ebenso bei 
MacOS bis einschließlich Version 9.x.

Bei kooperativem Multitasking kann ein Kontextwechsel entweder beim 
Aufruf einer Systemfunktion (Ein-/Ausgabe o.ä.) erfolgen oder wenn in 
einer langwierigen Rechenschleife explizit die Kontrolle abgegeben wird. 
Solch ein Aufruf heißt meist yield() o.ä..

von Falk B. (falk)


Lesenswert?

@Andreas (Gast)

>Also, es dreht sich alles darum, dass ich ein paar Codezeilen habe, die
>mit mittlerer Priorität abgearbeitet werden sollen, die aber sehr viel
>und lange auf unterschiedliche Hardware wartet.

Schlecht.

>ganze ein wenig in Richtung mini-Betriebssystem. Meint ihr, das ist
>sinnvoll?

Siehe Multitasking.

> Und habt ihr ne idee wie man sowas machen könnte? Den
>Prozesscounter in C auslesen dürfte ja relativ schwierig sein,

Ist auch nicht sinnvoll.

>Nur wie kann dann z.B. in einer "resumeOnInterrupt()"-Funktion ebenfalls
>den PC modifizieren?!

Du denkst viel zu kompliziert. Dein Problem ist ganz normal mit C ohne 
jegliche Tricks lösbar. Siehe oben.

von Rolf Magnus (Gast)


Lesenswert?

Andreas schrieb:
> Nun ist meine Idee, anstatt
> langen while(...); wartereien, eher eine Funktion wie
> "resumeOnInterrupt()" einzufügen, die solange einen anderen Prozess
> laufen lässt, bis eben ein bestimmter Interrupt auftritt. Dann soll der
> Code nach dem Resume wieder ausgeführt werden. Wahrscheinlich geht das
> ganze ein wenig in Richtung mini-Betriebssystem.

Ein RTOS macht sowas. Ein Beispiel dafür wäre FreeRTOS. Da wird das mit 
Semaphoren gelöst. Tasks können auf Semaphoren warten, und eine ISR 
setzt die Semaphore, wodurch die darauf wartende Task wieder 
ausführbereit wird und entpsrechend auch ausgeführt wird, wenn es nichts 
höherpriores mehr gibt.

> Meint ihr, das ist sinnvoll? Und habt ihr ne idee wie man sowas machen
> könnte? Den Prozesscounter in C auslesen dürfte ja relativ schwierig
>sein, aber im Interrupt wird er ja soweit ich weiß auf den Stack geladen,
> man müsste
> also nur in einem "naked"-Interrupt (dass, man auch weiß, was wo am
> Stack liegt) den Stack lesen und dort eben den PC des anderen Prozessen
> rein schreiben. Nach einem reti sollte ja dann der andere Prozess
> laufen. Natürlich sollte man dabei auch das Status-Register noch
> speichern und wiederherstellen.

Und alle normalen Register. Auch das macht ein RTOS.

> Nur wie kann dann z.B. in einer "resumeOnInterrupt()"-Funktion ebenfalls
> den PC modifizieren?!

Im Prinzip genauso wie du es oben bei der ISR beschrieben hast.

von Peter D. (peda)


Lesenswert?

Bei der klassischen Mainloop schreibt man die einzelnen Funktionen 
einfach so, daß sie abweisend warten:
1
funktion_1()
2
{
3
  if( Bedingung == nix_zu_tun )
4
    return;
5
  mache_was_1();
6
}
7
// ...
8
funktion_n()
9
{
10
  if( Bedingung == nix_zu_tun )
11
    return;
12
  mache_was_n();
13
}
14
15
int main()
16
{
17
  init();
18
  for(;;){
19
    funktion_1();
20
    // ...
21
    funktion_n();
22
  }
23
}

von Uwe (Gast)


Lesenswert?

Periodic Interupt timer und ne Statemachine mit Task managment

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.