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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.