preemptive scheduler

OP #423229
Lesenswert?

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
Gast #423233
Lesenswert?

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.
Gast #423250
Lesenswert?

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.
OP #424589
Lesenswert?

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.
Gast #424601
Lesenswert?

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.


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