hallo zusammen, ich programmiere auf einem cc2431 mit 8051 CPU ohne betriebssystem. habe mir einen scheduler nach dem round robin prinzip mit prioritäten gebaut. bis jetzt laufen die tasks alle nicht-preemptive ab. meine frage ist nun wie kompliziert das ist, preemptive scheduling zu realisieren?? also ich hätte gerne die funktionalitäten wie wait und notify. gruß, jimbo
"meine frage ist nun wie kompliziert das ist, preemptive scheduling zu realisieren??" Ist ganz simpel!!
Der Scheduler ist simpel. Nicht so simpel könnte die Frage sein, ob dein Programm damit klarkommt. Immerhin muss dann der Zugriff auf gemeinsame Resourcen geklärt werden, bei kooperativen Scheduling erledigt sich das von selber.
echt simple? ja das mit dem zugriff kann man ja recht einfach über semaphore machen. hat da vielleicht jemand einen link zu einem beispiel?
Wait und notify kannst du auch mit kooperativem scheduling kriegen. Musst nur sicherstellen, dass eine laufende Task ab und zu mal dem scheduler eine Chance gibt, d.h. ihn oft genug aufruft. Erspart dir die Problematik mit den Resourcen.
hallo A.K., klingt gut!!! mein haupt problem liegt aber darin: runtask1(...){ request(); -----> hier wird ein weiterer task erstellt der das ... paket versendet und test auf true setzt. while(test != true); } nun müsste ja task1 den prozessor freigeben, so dass der andere task das paket versenden kann und die variable auf true setzen. nun möchte gerne meinen scheduler einfach erweitern. folgende änderungen müsste ich vornehmen: -speichern des pc -stackpointer -stack ansich. hoffe hab nichts vergessen. mein problem ist nur, das ich sowas noch nie gemacht habe, deshalb wäre ich froh wenn du bzw. auch gerne jemand anderes ein kleines beispiel geben würde wie ich so etwas speichere bzw. wie man dabei vorgeht.
Wenn bei Verwendung eines Schedulers immer noch eine Zeile while(test != true); im Programm steht, hat jemand evtl. den Sinn eines RTOS nicht kapiert. Soll heissen: Für sowas baut man Events und Semaphoren ein. Aber wenn's denn sein soll: while (test != true) { yield(); } wobei "yield" eine Scheduler-Funktion ist, die die laufende Task hinten in die Warteschlange anhängt und die vorderste aktiviert.
erstmal vielen dank. sorry für die frage, aber wo genau finde ich dort das beispiel?
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.