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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.