mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik freertos: Wie funktioniert der kooperativer Betrieb ?


Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte mich in das Echtzeitbetriebssystem freertos 
einarbeiten.
Weiss jemand wie der "kooperativer Betrieb" in freertos funktioniert. 
Gibt es dazu eine Beispielapplikation?

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
user0815 schrieb:
> Weiss jemand wie der "kooperativer Betrieb" in freertos funktioniert.

Hallo,

kooperativ allgemein (Windows 16): die Applikationen müssen nach jeweils 
kurzer Laufzeit an das Betriebssystem zurückgeben (dazu genügt auch ein 
Aufruf einer Systemfunktion). Tut die Applikation das aber nicht, wird 
sie NICHT vom BS zwangsweise abgebrochen, d.h. sie kann das ganze System 
beliebig lange blockieren.

Gruss Reinhard

Autor: Kay I. (imperator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin kein freertos Experte, aber wie es in folgendem Link steht, stelle 
ich es mir so vor ...

http://www.freertos.org/tutorial/solution4.html

... dass der Sceduler beide Task-Arten kennt und aufrufen kann:
- preemptiv
- kooperativ

Die preemptiven werden nach Pio und vielen weiteren Flags 
deterministisch aufgerufen, dabei wird Stackpointer, Akku und alles 
weitere im Taskswitch wieder hergestellt. Die jeweilige Task "denkt" der 
Speicher/Prozessor "gehört" ihr allein und muss keine Ressourcen teilen.
Das OS lässt die Tasks in diesem glauben und unterbricht sich an irgend 
einer Stelle, wenn der SysTick-Timer den Sceduler wieder aktiviert hat.

Die Kooperativen Tasks werden laut der Quelle nur bei bedarf vom 
jeweiligen  Applikations-Code aufgerufen. Damit verhalten sie sich, wie 
eine Unterfunktion, die auch statische Variablen enthalten kann.
Kooperativ sind sie deswegen, weil sie die Kontrolle (Program-Counter) 
durch ihr return wieder freiwillig an die aufrufende Stelle abgeben 
(sollten).
Wie in der Quelle aber schon genannt, geht dabei die zeitliche 
Vorhersagbarkeit verloren.

Gruß,

Kay

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Multitasking

Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für eure Unterstützung.
Den kooperativen Betrieb kann ich den bei freertos mittels den 
Co-routines realisieren? Auf der Wiki Seite hab ich gelesen das freertos 
keine Eventfunktionalität besitzt. Wie kann ich sowas mit freertos 
realisieren?

Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann meinen kooperativen Betrieb etwa so realisieren?
 // Co-routine to be created.
 void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
 {
 // Variables in co-routines must be declared static if they must maintain value across a blocking call.
 // This may not be necessary for const variables.
 static const char cLedToFlash[ 2 ] = { 5, 6 };
 static const portTickType xTimeToDelay[ 2 ] = { 200, 400 };

     // Must start every co-routine with a call to crSTART();
     crSTART( xHandle );

     for( ;; )
     {
         // This co-routine just delays for a fixed period, then toggles
         // an LED.  Two co-routines are created using this function, so
         // the uxIndex parameter is used to tell the co-routine which
         // LED to flash and how long to delay.  This assumes xQueue has
         // already been created.
         vParTestToggleLED( cLedToFlash[ uxIndex ] );
         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
     }

     // Must end every co-routine with a call to crEND();
     crEND();
 }

 // Function that creates two co-routines.
 void vOtherFunction( void )
 {
 unsigned char ucParameterToPass;
 xTaskHandle xHandle;
    
     // Create two co-routines at priority 0.  The first is given index 0
     // so (from the code above) toggles LED 5 every 200 ticks.  The second
     // is given index 1 so toggles LED 6 every 400 ticks.
     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
     {
         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
     }  
 }

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  user0815 (Gast)

>Kann meinen kooperativen Betrieb etwa so realisieren?

Nö. Kooperativ heißt, dass deine Funktion/Task beim Aufruf einmal zügig 
durchlaufen wird, etwas Artbeit verrichtet und danach GARANTIERT wieder 
verlassen wird. Denn die anderen Aufgaben wollen ja auch beackert 
werden. Eine Endlosschleife ist dazu denkbar ungeeignet, vor allem ohne 
break.

Siehe Multitasking, die II.

Was du da oben skizziert hast ist das Gegenteil, nämlich päemtiv.

MfG
Falk

Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Erklärung. Ja wie funktioniert bei freertos der 
kooperative Betrieb? Gibt es dazu auch ein Beispiel?

Autor: Unwissender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab gerade kein Code zur Hand, aber wenn ich mich recht erinnere 
wird bei FreeRtos auch beim kooperativem Betrieb eine Endlosschleife 
erwartet (bei FreeRtos wird niemals ein Task beendet). Der Rücksprung 
zum Betriebssystem und damit zu anderen Tasks erfolgt durch einen Befehl 
an einer entsprechenden Stelle (dies kann eine Wartezeit sein oder die 
generelle Abgabe des Tasks, Genaue Befehle kenne ich nicht mehr aus dem 
Kopf und hab die Doku gerade nicht zur Hand).

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der kooperative Betrieb ist generell, dh nicht bezugnehmend auf ein 
RTOS, immer eine schnelle Sequenz von Befehlen die jeweils auf einen 
blockierenden Event/Wait warten. Dh  sie warten immer auf eine Semaphore 
oder was Abgeleitetem, dh Event, Message, Mailbox, usw.  Schnelle Squenz 
deshalb, weil sonst das System auf den langsamsten wartet. Wenn also ein 
Task die Floatingpoint Matritzen abspult, sollte dieser Task hin und 
wieder auf ein nichtblockierendes wait() durchlaufen. Ein 
nichtblockierendes Wait() ist eigentlich ein Polling, das der tiefst 
priorisierte Task machen darf um dem System Zeit fuer irgendwas zu 
geben.

Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf der http://www.freertos.org/ konnte ich nichts konkretes dazu 
finden, wie man so einen kooperativen Betrieb realisieren kann.

Weiterhin ist mir auch noch ein Rätsel, wie man in feeertos Events 
erzeugen bzw. darauf reagieren kann. Laut wiki Seite kann der keine 
Events erzeugen.

Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das Zeitscheibenverfahren (round robin scheduling) einsetzen 
möchte, muss ich dann allen Tasks die gleiche Priorität vergeben?
Beispiel: drei Tasks mit der Priorität: Nr.: 1

Autor: FreeRtosAnswer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Bzgl. der Events: Du kannst ja die BinarySemaphore dazu benutzen. Oder 
was meinst du genau mit Events?
Mit den Semaphoren kann du ja solange in einem Task warten bis diese 
(von einem anderen Task) gesetzt/signalisiert wird.

Lg

Autor: FreeRtosAnswer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bzgl Round Robin: kA wie das in FreeRTOS implementiert ist, würde aber 
sagen, dass wenn alle Task die selbe Prio haben das ganze nach dem Round 
Robin Scheduling funktioniert (wie den auch sonst). Wie und in welcher 
Reihenfolge die Task dann aktiviert werden musst im Code nachsehen (obs 
wirklich round robin ist).

Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo FreeRtosAnswer,

zum Thema Events:

Ich möchte zum Beispiel in einer Task einen Event senden.
In einer zweiten Task möchte ich dort auf diesen Event reagieren bzw. 
empfangen.

Kann ich dies mit einer "BinarySemaphore" realisieren?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
user0815 schrieb:
> Hallo FreeRtosAnswer,
>
> zum Thema Events:
>
> Ich möchte zum Beispiel in einer Task einen Event senden.
> In einer zweiten Task möchte ich dort auf diesen Event reagieren bzw.
> empfangen.
>
> Kann ich dies mit einer "BinarySemaphore" realisieren?

Wie du das dann nennst, ist egal. Du kannst es natürlich Event nennen.
Der eine signalisiert etwas, der andere wartet auf die Signalisierung. 
Ich würde mal sagen, in anderen Betriebssystemen nennt man so etwas 
einen Event.

Und der Mechanismus, mit dem ein Task einem anderen etwas mitteilt, ja 
das kann eine Semaphore sein.

Alles in allem verraten deine Fragen, dass du im Moment zu große Bissen 
vom Kuchen abbeist. Du gehst zur Zeit anscheinend auf dein Ziel zu, ohne 
wenigstens ein bischen was über den Weg zu kennen. Mein Vorschlag: lerne 
FreeRTOS kennen, und zwar unvoreingenommen von deiner eigentlichen 
Aufgabenstellung. Programmier ein wenig. Übe ein wenig. Sieh dir an, 
welche Dinge es gibt, wie man sie benutzt. Und erst dann wendest du dich 
deinem eigentlichen Problem zu. Zuerst muss man seinen Werkzeugkasten 
kennen, ehe man sich daran macht damit etwas zu bauen.

Autor: user0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Rat. Ich werde mir freertos unabhängig von meiner Aufgabe 
erst etwas besser kennelernen. Vielleicht kaufe ich mir auch das eBook 
von http://www.ebookaktiv.de/eBook_RTOS/eBook_FreeRTOS.htm. Kennt jemand 
dieses eBook genauer?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.