Forum: Mikrocontroller und Digitale Elektronik task vs. co-routine


von brechbunkt (Gast)


Lesenswert?

Hallo,

ich arbeite mich gerade in freeRTOS ein und habe irgendwie ein 
Verständnisproblem zwischen "co-routinen" und "tasks":

http://www.freertos.org/croutine.html
http://www.freertos.org/a00015.html

Was soweit klar ist, ist, dass der Task immer eine höhere Priorität hat. 
Aber was soll da sonst noch anders sein? Beide brauchen einen stack und 
beide brauchen ihre Zeit für den context-switch.

von brechbunkt (Gast)


Lesenswert?

Bin ich etwa nicht der einzige, der hier keinen weiteren Unterschied 
sehen kann?

von (prx) A. K. (prx)


Lesenswert?

Der Unterschied zwischen Coroutines und Tasks ist ziemlich markant:
- Sie sind nicht preemptive, sondern cooperative.
- Kein eigener Stack, deshalb Einschränkungen bei lokalen Variablen.

von Michael G. (let)


Lesenswert?

Auf der FreeRTOS Seite gibt es doch gleich oben drüber eine schöne 
Übersicht:
http://www.freertos.org/taskandcr.html

Coroutinen sind allerdings nur noch aus Kompatibilitätsgründen in 
FreeRTOS enthalten. In der kostenpflichtigen Doku (Tutorial und 
Referenzhandbuch) werden sie nicht mehr erwähnt.

von brechbunkt (Gast)


Lesenswert?

Die Sache mit dem Stack leuchtet mir irgendwie immer noch nicht ein 
(sorry für meine Unwissenheit).

Wenn ein Task die co-routine unterbricht, müssen doch die Variablen der 
co-routine irgendwo in einem Stack abgelegt werden. Dann ist es aber 
(meiner Meinung nach) auch egal ob sich dieser Stack innerhalb oder 
außerhalb eines Tasks befindet. Der dafür benötigte Stack hätte dann 
trotzdem immer die gleiche Größe.

von Chris (Gast)


Lesenswert?

cooperative Tasks werden oft als Macros implementiert, welche dann
im Main sind, und zumindest bei GCC wird gerne ein computed goto 
zusammen
mit dem _LINE_ verwendet, um sowas zu implementieren.
So hat man keine Probleme wegen des Levels der Klammer.

So hat man ein Level, und alle Unterprogramme kommen zurück.
Generell gilt:
Ein Prozess darf in Unterprogrammen Yield bzw sleep usw machen,
die restlichen Prozesse, wenn sie ein Unterprogramm aufrufen muss das
Unterprogramm zurückkehren ohne ein Taskwechsel zu machen.
Beispiel für Unterprogramme welche Sleep machen sind z.B. 
Displaysteuerung
usw.

von (prx) A. K. (prx)


Lesenswert?

brechbunkt schrieb:
> Wenn ein Task die co-routine unterbricht, müssen doch die Variablen der
> co-routine irgendwo in einem Stack abgelegt werden.

Jede Task hat einen eigenen Stack, aber alle Coroutinen teilen einen 
gemeinsamen Stack, nämlich den der Idle-Task. So entsteht kein Konflikt 
zwischen Task und Coroutine. Zwischen Coroutinen sieht das anders aus.

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.