Forum: Mikrocontroller und Digitale Elektronik wie funktioniert ein Taskwechsel?


von Markus (Gast)


Lesenswert?

Guten Morgen zusammen,

ich hab ein Verständisproblem was den Taswechsel angeht...
mal angenommen ein niederpriorer Task läuft ab. jetzt meldet sich ein 
höherprioer Task an. Dann unterbricht der niederpriore Task durch eine 
ISR und anschließen (präemtiv) läuft der höher priore Task ab (soweit 
richtig?). Dieser läuft nun ab ohne unterbrochen zu werden. Aber was 
passiert danach?
Und was würde passieren wenn der niederpriore Task eine Semaphore "hält" 
und somit der höherpriore Task nicht ganz ablaufen kann?
Muss zwischen den Taskwechseln immer eine ISR ausgelöst werden?

Wär super wenn mir jemand weiterhelfen könnte!
vielen Dank schon mal
Gruß
Markus

von Karl H. (kbuchegg)


Lesenswert?

Markus schrieb:

> ich hab ein Verständisproblem was den Taswechsel angeht...
> mal angenommen ein niederpriorer Task läuft ab. jetzt meldet sich ein
> höherprioer Task an. Dann unterbricht der niederpriore Task durch eine
> ISR und anschließen (präemtiv) läuft der höher priore Task ab (soweit
> richtig?).

Das kann man so nicht sagen. Das hängt vom 'Betriebssystem' ab, wie es 
implementiert ist. Manche mögen das so machen, andere wiederrum nícht. 
Task existieren ja nicht im luftleeren Raum sondern im Kontext eines 
Schedulers, der ihnen Rechenzeit zuteilt.

> Dieser läuft nun ab ohne unterbrochen zu werden. Aber was
> passiert danach?

Dann kommt wieder der Scheduler zum Zug, der den nächsten Task auswählt.

> Und was würde passieren wenn der niederpriore Task eine Semaphore "hält"
> und somit der höherpriore Task nicht ganz ablaufen kann?

Dann blockieren sich die beiden und im schlimmsten Fall hast du einen 
Deadlock.

> Muss zwischen den Taskwechseln immer eine ISR ausgelöst werden?

Auch das hängt wieder von der Systemarchitektur ab.
Bei beispielsweise kooperativem Multitasking entscheiden die Tasks 
selber, wenn sie die Kontrolle abgeben und zurück zum Scheduler geben.

von 123 (Gast)


Lesenswert?

Moin

1. es gibt einen sceduler, der die rechenzeit der einzelnen Prozesse / 
Tesks steuert.

2. es gibt meist einen Timer IRQ der dei zeitscheibensteuerung für die 
OS funktionen übernimmt.

3. der Sceduler wird nach fast jedem OS funktionsaufruf kurz angestossen 
und nach ablaufen des timers; es wird jetzt wieder neu ermittelt, welche 
task auszuführen ist.


Das warten auf eine Semaphore blokiert deine task solage bis die resorce 
zur verfügung steht (oder der angegebene timeout abgelaufen ist) und 
wird danach ausgeführt.

die Funktion prüft als erstes ob die Resource zur verfügung steht oder 
nicht, setzt dann entsprechend den Status der Resource und task neu. 
danach wird der sceduler neu angeschmissen um rauszubekommen, welche 
task nun ausgeführt werden soll. der wählt die höchst priorisierte task 
aus der liste der als lauffähig markierten Tasks aus. Welche das nun ist 
hängt vom algorithmus ab. ob hier z.B. zeitscheiben eine rolle spielen 
oder nicht, mehrer task die gleiche priorität haben dürfen, ...

Der Timer wird z.B. alle 10ms aufgerufen, und dient z.B. zur steuerung 
der Timeouts. Das warten der Semaphore mit timeout würde z.B. da zu 
führen, das nach n durchläufen ohne freigabe der resource die task in 
die liste der ausführbaren task geschoben wird. (mit dem vermerk 
timeout) , oder zur timeoutsteuerung für round robin seculer, ...

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.