Forum: Mikrocontroller und Digitale Elektronik preemptive scheduler


von Max D. (jimbo)


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

von Johannes (Gast)


Lesenswert?

"meine frage ist nun wie kompliziert das ist, preemptive scheduling zu
realisieren??"


Ist ganz simpel!!

von A.K. (Gast)


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.

von Max D. (jimbo)


Lesenswert?

echt simple?
ja das mit dem zugriff kann man ja recht einfach über semaphore machen.
hat da vielleicht jemand einen link zu einem beispiel?

von A.K. (Gast)


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.

von Max D. (jimbo)


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.

von A.K. (Gast)


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.



von A.K. (Gast)


Lesenswert?


von Max D. (jimbo)


Lesenswert?

erstmal vielen dank.
sorry für die frage, aber wo genau finde ich dort das beispiel?

von Max D. (jimbo)


Lesenswert?

hat sich erledigt.
nochmals danke

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.