Forum: Mikrocontroller und Digitale Elektronik Threads / Tasks / FreeRTOS


von Alexander M. (a_lexander)


Lesenswert?

Hallo Zusammen!

Mich beschäftigt aktuell eine Frage bezüglich FreeRTOS / Tasks & 
Threads, vielleicht kann dir mir einer beantworten ;)

Frage: Was ist der Unterschied zwischen Tasks & Threads bei einem 
FreeRTOS?

Angenommen: 1 CPU, OS FreeRTOS
Dann: gibt es nur Tasks, und keine Threads.

Angenommen: 2 oder CPUS, OS FreeRTOS
Dann: kann es mehrere Tasks geben, und wenn ich diese aufteile auf die 
CPUs, sind das Threads.

Stimmt das?

Danke :)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Nich wirklich.
Threads sehen alle den selben Speicherbereich.
Also können sich gegenseitig Variablen übeschreiben.
Prozesse haben eigene virtuelle Speicherbereiche und sehen sich daher 
nicht gegenseitig.

Für Prozesse brauchts eine MMU, diese kann FreeRTOS nicht bedienen.

Daher gilt dort Task=Thread.

von Alexander M. (a_lexander)


Lesenswert?

Okay danke :)

Dann besteht aber doch ein FreeRTOS streng genommen aus Threads oder

xTaskCreate() --> xThreadCreate() ;)

Grüße

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ein Task ist ist ein allgemeinerer Name.

Ein Task ist einfach nur das was getan werden soll, also eine Ansammlung 
an Instruktionen im Speicher. Die Ausführung ist egal ob als Thread, 
Prozess, bare metal oder Threadpool.

Nur FreeRTOs kann eben nur Threads.

von Programmierer (Gast)


Lesenswert?

Aus dem FreeRTOS Buch:

In  FreeRTOS,  each  thread  of  execution  is  called  a  ‘task’. 
There  is  no  consensus  on terminology  within  the  embedded 
community,  but  I  prefer  ‘task’  to  ‘thread,’  as  thread  can  have 
a more specific  meaning  in some  fields of  application.

Alexander M. schrieb:
> Dann besteht aber doch ein FreeRTOS streng genommen aus Threads

Stimmt...

von Alexander M. (a_lexander)


Lesenswert?

Danke für die Hilfe ;)

Dann noch abschließend vielleicht die Frage:

Mit FreeRTOS auf uC-Basis kann lediglich 1 Prozess gestartet werden, mit 
(natürlich) mehreren Threads (xTaskCreate).
Mehrere Prozesse würden, wie in dem Beitrag auch bereits erwähnt, eine 
MMU benötigen, und die jeweiligen Prozesse könnten nicht auf gemeinsame 
Ressourcen (keine Semaphoren, keine gemeinsamen Variablen) zugreifen.

Ich kann aber in FreeRTOS durch keine gemeinsame Verwendung von 
Variablen "quasi" mehrere Prozesse (xTaskCreate) laufen lassen, stimmt 
das :D?

Danke ;)

von (prx) A. K. (prx)


Lesenswert?

Ganz konsistent ist FreeRTOS dabei nicht. Weil sich der Begriff anderswo 
eingebürgert hat, gibts auch in FreeRTOS mittlerweile "thread local 
storage". Mitten in einer Funktionsgruppe, die sonst den Begriff "Task" 
verwendet.

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Alexander M. schrieb:
> Mehrere Prozesse würden, wie in dem Beitrag auch bereits erwähnt, eine
> MMU benötigen, und die jeweiligen Prozesse könnten nicht auf gemeinsame
> Ressourcen (keine Semaphoren, keine gemeinsamen Variablen) zugreifen.

Doch, die können auf gemeinsame Ressourcen (zB ein UART oder shared 
memory) Zugreifen, aber eben nur über eine OS API oder Treiber API.
OS API -> monolitischer Kernel wie Linux
Treiber API, die als eigener Prozess läuft -> Mikrokernel
... und schon sind wir im Thema OS Design ;)

2 Pozesse können dann per "Interprozesskommunikation" miteinander reden:
https://de.wikipedia.org/wiki/Interprozesskommunikation
http://openbook.rheinwerk-verlag.de/linux_unix_programmierung/Kap09-000.htm

Alexander M. schrieb:
> Ich kann aber in FreeRTOS durch keine gemeinsame Verwendung von
> Variablen "quasi" mehrere Prozesse (xTaskCreate) laufen lassen, stimmt
> das

Nein, denn du kannst ja jetzt nicht 2 Threads mit demselben Code 
starten.
Die nutzen ja dann dieselben globalen Variablen.
Nur lokale Variablen, die auf den Stack landen, sind dann getrennt.
Die MMU würde jetzt beide virtuelle Speicherbereiche auf 
unterschiedliche physikalische Speicherbereiche mappen.

A. K. schrieb:
> gibts auch in FreeRTOS mittlerweile "thread local
> storage". Mitten in einer Funktionsgruppe, die sonst den Begriff "Task"
> verwendet.

Einfach nur ein anderer Name für Variablen auf dem Stack oder geht das 
mit der MPU Erweiterung einher?

von (prx) A. K. (prx)


Lesenswert?

Mw E. schrieb:
> Einfach nur ein anderer Name für Variablen auf dem Stack oder geht das
> mit der MPU Erweiterung einher?

Üblicherweise versteht man unter diesem Begriff eine Sorte globaler 
Variablen, die aber in jedem Thread getrennte Werte haben können. Wie 
das implementiert wird, ist dann von OS und Hardware abhängig.

Bei x86 in Windows/Linux wird das über eines der sonst nicht mehr 
verwendeten Segmentregister implementiert. Ich habe nicht nachgesehen, 
aber in FreeRTOS könnte es ein Pointer im Task Record sein, der in jeder 
Task auf einen anderen Speicherbereich zeigt.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Hier gibt's eine ausführliche Beschreibung für verschiedene 
(nicht-µC-)Plattformen: https://www.akkadia.org/drepper/tls.pdf

von Alexander M. (a_lexander)


Lesenswert?

Vielen Dank für die Informationen :)

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.