Forum: Mikrocontroller und Digitale Elektronik RTOS ohne Multithreading?


von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hallo,

bekanntlich ist ein RTOS im Grundprinzip ein präemptiver Scheduler für 
Multithreading mit einem speziellen Algorithmus für 
Echtzeit-Unterstützung.

Allerdings haben heutige RTOSe (z.B. Zephyr, RT-Thread usw) ja eine 
große Anzahl an zusätzlichen Komponenten und Middlewares wie z.B. 
Networking, Dateisysteme, Power Management, Treiber für externe interne 
& externe Peripherie, Kryptographie, OTA-Updates usw.

"Eigentlich" sind diese Zusatz-Komponenten ja orthogonal zum Scheduler 
und nicht wirklich von diesem abhängig.

Präemptives Multithreading ist außerdem schwierig sicher handzuhaben 
durch Race Conditions, Deadlocks & Co - es ist sehr leicht, subtile 
Fehler einzubauen, die nur sehr selten auftreten und kaum zu finden 
sind.

Wenn ich also diese zusätzlichen Komponenten/Libraries nutzen möchte, 
aber eben kein präemptives Scheduling haben möchte, hat man kaum eine 
Option, richtig? Dinge wie Flash-Filesystems sind immer in synchron 
implementiert in der Annahme, dass ein präemptives Scheduling im 
Hintergrund läuft.

Was gibt es für Möglichkeiten, solche Komponenten (Networking, 
Flash-Filesysteme, Peripherie-Treiber) ohne präemptives Scheduling zu 
nutzen? Neben der Flickschusterei für jeden Aspekt eine Bibliothek zu 
finden und diese irgendwie unter einen Hut zu bringen?

PS: Interessanterweise scheint die Echtzeit-Fähigkeit von RTOSen in der 
Praxis eine geringe Rolle zu spielen. Welcher Scheduling-Algorithmus 
dort arbeitet, wie lange genau ein Task braucht usw. wird anscheinend 
selten betrachtet. Im Studium war das allerdings das Einzige, was über 
RTOSe gelehrt wurde... Der "RT"-Teil in "RTOS" scheint nur von 
akademischem Interesse zu sein?

von Oliver S. (oliverso)


Lesenswert?

Niklas G. schrieb:
> Der "RT"-Teil in "RTOS" scheint nur von
> akademischem Interesse zu sein?

Nun ja, bei dem einem vielleicht. Gerüchteweise gibts aber doch noch 
mindestens ein zweites…

Oliver

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Niklas G. schrieb:
> Was gibt es für Möglichkeiten, solche Komponenten (Networking,
> Flash-Filesysteme, Peripherie-Treiber) ohne präemptives Scheduling zu
> nutzen? Neben der Flickschusterei für jeden Aspekt eine Bibliothek zu
> finden und diese irgendwie unter einen Hut zu bringen?

Vielleicht sind dem Adam Dunkels seine Protothreads was für dich.

von 900ss (900ss)


Lesenswert?

Niklas G. schrieb:
> Wenn ich also diese zusätzlichen Komponenten/Libraries nutzen möchte,
> aber eben kein präemptives Scheduling haben möchte, hat man kaum eine
> Option, richtig?

Nö. VxWorks kann diesen Anspruch erfüllen. Dort kann man den Scheduler 
entsprechend konfigurieren. Probiert hab ich diese Option selber nie.
Und VxWorks kostet Geld, viel Geld ;)
Und ich bin mir sicher dass es noch andere RTOS gibt die nur mit 
kooperativem Scheduler laufen können.

von J. S. (jojos)


Lesenswert?

Niklas G. schrieb:
> Wenn ich also diese zusätzlichen Komponenten/Libraries nutzen möchte,
> aber eben kein präemptives Scheduling haben möchte, hat man kaum eine
> Option, richtig? Dinge wie Flash-Filesystems sind immer in synchron
> implementiert in der Annahme, dass ein präemptives Scheduling im
> Hintergrund läuft.

nicht immer, bei Mbed wurde das teilweise getrennt.
In Mbed 2 war das OS nur ein API das Komponenten wie DitalIn/Out, 
Serial, I2C, CAN, Software Timer und mehr abstrahiert hat. Einen RT 
Scheduler konnte man optional dazubauen. Das hatte den Nachteil das die 
Basic OS Komponenten nicht threadsafe waren und diese Kombi mit Vorsicht 
zu geniessen war.
In Mbed 5/6 wurde der Scheduler (RTX von ARM) fest eingebaut und Threads 
berücksichtigt. Mbed 5 wurde dadurch aber sehr fett und viele kleine 
Controller waren damit nicht mehr geeignet.
Dann wurde Mbed 6 besser modularisiert und der RT Teil einfach 
konfigurierbar im Build gemacht. In der Variante baremetal hat man dann 
wieder nahezu alles an Treibern, aber eben ohne den Scheduler und die 
RTOS nötigen Dinge wie Semaphore, Mailboxen usw. Nur im Ethernet Code 
wird das RT und Features wie EventFlags verwendet, daher ist das nur in 
der RTOS Variante nutzbar. Obwohl, soviel wird da nicht mit Threads 
gemacht und es könnte auch ohne gehen. Aber bei Controllern mit EMAC hat 
man üblicherweise auch genug Resourcen für das RTX, und man muss ja 
keine weiteren Threads starten. Praktisch ist es aber schon.
Bei ohne RTX gibt es im baremetal trotzdem die EventQueues, damit kann 
man kooperative Scheduling elegant lösen. In die EventQueue kann man 
Funktionen reinwerfen die dann in der mainloop ausgeführt werden, auch 
gut um Code aus ISR vom Interruptcontext zu entkoppeln. Hier wird der 
Komfort den C++ bietet genutzt, die EventQueues sind absolut genial.

von 900ss (900ss)


Lesenswert?

900ss schrieb:
> VxWorks kann diesen Anspruch erfüllen.

Ich hab das so aus der Erinnerung geschrieben, die aber trügt (glaube 
ich jetzt). Es geht kein kooperatives Multitasking, sondern man kann dem 
Scheduler nur sagen, er soll Round Robin arbeiten, nicht kooperativ.

Kann auch nicht mehr nachsehen ;)

von Purzel H. (hacky)


Lesenswert?

Der Poster hat leider viel weniger wie gar keine Ahnung. Ein RTOS ist 
speziell fuer Echtzeit gemacht. Genau deswegen wird's verwendet, fuer 
nichts anderes. Allerdings sollte man einige Punkte beachten.

Ein Echtzeit System muss nicht maximal schnell sein, sondern 
zuverlaessig schnell mit einer definierten maximalen Reaktionszeit.
Also nichts mit zufaelligen Garbage collector, welcher wie auch immer 
lange braucht. Oder ein Systemupdate reinzieht und den Rechner auf 
irgendwelche Zeit blockiert.
Je nach Einsatzumfeld reichen vielleicht 10ms Reaktionszeit. Bei einem 
Auto moechte man eher bei 1ms liegen.

Ein Stueck Hardware ist eine Ressource und muss natuerlich richtig 
geshart werden. Resp man hat einen Thread pro Ressource und dieser 
bedient die Hardware Funktionalitaet. Ungeteilt. Also, die Ethernet 
Schnittstelle ist ein Thread. Andere Threads mit Bedarf werden von 
diesem bedient. Wann der seine Zeitscheibe bekommt ist weniger wichtig.
Desgleichen das Filesystem. Allenfalls stellt das schon das RTOS sicher, 
und sonst muss man's eben selbst machen.

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Niklas G. schrieb:
> Was gibt es für Möglichkeiten, solche Komponenten (Networking,
> Flash-Filesysteme, Peripherie-Treiber) ohne präemptives Scheduling zu
> nutzen? Neben der Flickschusterei für jeden Aspekt eine Bibliothek zu
> finden und diese irgendwie unter einen Hut zu bringen?

Selber schreiben. Wenn man kein Multithreading hat und dennoch 
verschiedenen Aufgaben parallel abzuarbeiten hat, dann muss man jede 
Aufgabe in kleinere Teilaufgaben zerstückeln und diese dann 
häppchenweise und/oder asynchron ausführen. Asynchrone Architekturen 
sind aber nicht jedermanns Sache, da muss man oft um die Ecke denken. 
Deswegen wird sehr oft einfach ein RTOS benutzt und es gibt nicht so 
viele fertige Libraries dafür.

RTOS macht das einfacher, hat dafür aber auch Nachteile, jeder Thread 
benötigt einen eigenen Stack, Kontextwechsel und Synchronisation kosten 
Performance.

Von der Laufzeit Seite her kann man "Parallelität" bzw Preämptive 
Systeme aber auch anders erreichen. Z.b mit Interrupten. Im Usermode 
führt man alles aus, was langsam ablaufen und damit synchron umgesetzt 
werden kann  und im Interruptmode das wo es Zeitanforderungen gibt. Aber 
auch Polling kann eine Option sein und ist nicht unbedingt schlechter. 
Z.b. kann man eine "Aufgabe" in Teilaufgaben aufteilen und das in eine 
Zustandsmachine verpacken. Dann "pollt" man einfach in der Hauptschleife 
alle Zustandsmaschinen nacheinander. Das ist dann  kooperatives 
Multitasking.

Ich selbe nutze meist Queues mit Funktionspointern + Interrupte. Jede 
Teilaufgabe kommt in eine Funktion und wenn die halt ausgeführt werden 
muss, dann wird der Funktionspointer in die FIFO geworfen. Die "main" 
Funktion macht nichts weiter als auf die Queues (können mehrere sein, 
z.B. hochpriore und niederpriore) zu schauen und sich dort die 
Funktionsspointer rauszuziehen und auszuführen. Eine weitere Queue 
enthält dann noch die (Software)Timer...

von Christian B. (casandro)


Lesenswert?

Die Frage ist, was willst Du genau nutzen? Solche RTOS Betriebssystem 
sind halt in der Regel primär Taskswitcher, willst Du mehr musst Du das 
bei vielen woanders her holen.

Es gibt zum Beispiel viele Dateisystemsroutinen welche Du, völlig 
unabhängig vom Betriebssystem, verwenden kannst. Zum Beispiel so was 
hier, falls Du FAT haben möchtest. https://github.com/FullFAT/FullFAT
Für Spezialanwendungen kann es aber einfacher sein, mal eben selbst ein 
Minimalstdateisystem zu stricken.

Willst Du Netzwerk haben, so wird es etwas schwieriger, da es im 
Allgemeinen sinnvoll ist, wenn Dein Netzwerkstack Dinge im Hintergrund 
machen kann. Damit kann beispielsweise die ARP-Anfrage rechtzeitig bevor 
der ARP-Cache ausläuft gemacht werden. Auch bei Protokollen wie TCP 
(eine Art 1-Stream SCTP) kann es sinnvoll sein, wenn der Stack einen 
Thread hat, der sich um Retransmissions u.Ä. kümmert.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Andreas M. schrieb:

> Asynchrone Architekturen
> sind aber nicht jedermanns Sache, da muss man oft um die Ecke denken.

Ich denke mal, das ist das Grundproblem.

Schlimmer noch: es muss noch nicht mal echte Asynchronität und die damit 
verbundenen Probleme sein. Viele Möchtegern-Programierer kommen ja nicht 
mal mit einem Ereignis-gesteuerten Programmierschema zurecht, was 
ordentlich innerhalb eines einzigen Threads/Tasks abgearbeitet wird, 
also simplen state machines.

Wenn die Kontrollstruktur nicht als solche im Code steht, sind die 
aufgeschmissen und begreifen nicht mehr, was da eigentlich passiert.

Nicht schlimm, nicht jeder ist zum Programmierer geboren. Aber: Die 
sollten dann auch einfach nicht programmieren. Es ist ihnen nicht 
gegeben.

von Bruno V. (bruno_v)


Lesenswert?

Niklas G. schrieb:
> Präemptives Multithreading ist außerdem schwierig sicher handzuhaben
> durch Race Conditions, Deadlocks & Co - es ist sehr leicht, subtile
> Fehler einzubauen, die nur sehr selten auftreten und kaum zu finden
> sind.

Vielleicht solltest Du 3 Dinge trennen:

1) Die verschiedenen Eigenschaften eines RTOS (z.B. verschiedene Arten 
von Schedulern)
2) Dein Nutzen des RTOS (Abhängig von Deinen Kenntnissen)
3) die "Zusatzfunktionen" des RTOS

In Autosar z.B. sind "Basic Tasks" nichts anderes als Funktionen, die 
aufgerufen werden und ohne jedes Warten durchlaufen (müssen).

Wenn Du mit einer Task auskommst, dann brauchst Du Dich um die 
allermeisten Dinge gar nicht zu kümmern und kannst trotzdem die 
"Zusatzfunktionen" nutzen, da die ja von Leuten implementiert wurden, 
die das RTOS kennen.

Wenn Du mehrere Tasks brauchst, gibt es unzählige Pattern, um typische 
Fallstricke zu umschiffen. Die meisten haben auch vorher schon mehrere 
Tasks und Prioritäten gehabt und sie "Interrupt-Routine" genannt. Viele 
Probleme sind ähnlich oder gleich. Fang einfach an. Oft mit einer Loop 
und davon entkoppelter GUI. Spring ins kalte Wasser, je eher lernst Du 
schwimmen.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Ob S. schrieb:
> Wenn die Kontrollstruktur nicht als solche im Code steht, sind die
> aufgeschmissen und begreifen nicht mehr, was da eigentlich passiert.
>
> Nicht schlimm, nicht jeder ist zum Programmierer geboren.

Das scheint mir doch eine recht seltsame Ansicht zu sein!

Wenn irgendwas X mal gemacht werden soll, dann will ich da eine zählende 
for Schleife sehen.
Ohne wenn und aber!

Ebenso eine Endlosschleife, wenn irgendwas dauerhaft getan werden soll.
z.B. so: while(not stromausfall) tuwas();

Alles andere widerspricht dem Prinzp der geringsten Verwunderung.
Und ein Verstoß dagegen ist unter Programmierern doch eher ein NoGo.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Arduino F. schrieb:
> Wenn irgendwas X mal gemacht werden soll, dann will ich da eine zählende
> for Schleife sehen.
> Ohne wenn und aber!

Wenn Deine Schleife auf einem System mit kooperativen Multitasking 
laufen soll und nicht das ganze System während der Ausführungszeit der 
Schleife blockiert sein soll, dann hast Du mit der Einstellung ein 
Problem.

Ein schönes Beispiel für kooperatives Multitasking waren die 
16-Bit-Versionen von Windows. Gut beschrieben in der zweiten Ausgabe von 
Charles Petzolds "Programming Windows" von 1990 oder in der dritten 
Ausgabe von 1992*.

Wenn ich mich recht erinnere, gab es das Buch auch mal als Beigabe zu 
einer Version des 16-Bit-Borland-C/C++-Compilers (die mit dem guten 
halben Meter Papier)

*) https://archive.org/details/programming-windows-31-3rd-ed

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Harald K. schrieb:
> Arduino F. schrieb:
>> Wenn irgendwas X mal gemacht werden soll, dann will ich da eine zählende
>> for Schleife sehen.
>> Ohne wenn und aber!
>
> Wenn Deine Schleife auf einem System mit kooperativen Multitasking
> laufen soll und nicht das ganze System während der Ausführungszeit der
> Schleife blockiert sein soll, dann hast Du mit der Einstellung ein
> Problem.

Nein, habe ich nicht!


Siehe:
Arduino F. schrieb:
> Vielleicht sind dem Adam Dunkels seine Protothreads was für dich.

Habe mir eine Abwandlung davon gebaut, die auch auf kleinen AVR ganz gut 
zu nutzen ist.

: Bearbeitet durch User
von Til S. (Firma: SEGGER) (til_s)


Lesenswert?

Niklas G. schrieb:
> Allerdings haben heutige RTOSe (z.B. Zephyr, RT-Thread usw) ja eine
> große Anzahl an zusätzlichen Komponenten und Middlewares wie z.B.
> Networking, Dateisysteme, Power Management, Treiber für externe interne
> & externe Peripherie, Kryptographie, OTA-Updates usw.
>
> "Eigentlich" sind diese Zusatz-Komponenten ja orthogonal zum Scheduler
> und nicht wirklich von diesem abhängig.

Auch wenn es eigentlich schon beantwortet wurde, hier nochmal am 
Beispiel von embOS. Gilt aber genauso für FreeRTOS, etc.

Du kannst ein reines RTOS wie embOS benutzen. Das ist der Scheduler 
inkl. passender API, um Tasks laufen zu lassen, zu synchronisieren, usw.
https://www.segger.com/doc/UM01001_embOS.html

Daneben gibt es Embedded Software, wie TCP/IP Stack, USB Stack, 
Filesystem, usw.
https://www.segger.com/products/rtos-embedded-software/

Aus Sicht des RTOS ist das alles Applikation, d.h., ob ein Filesystem 
läuft oder deine Applikation ist dem RTOS egal. Wenn z.B. das Filesystem 
in mehreren Tasks genutzt werden soll, muss es thread-safe sein.

Die Embedded Software kannst du auch ohne RTOS, als bare metal, laufen 
lassen (oder auch mit jedem anderen RTOS). Dann ist aber deine 
Applikation dafür verantwortlich, dass alle Teile deiner Applikation den 
Echtzeitanforderungen entsprechen. Es gibt Embedded Software wie z.B. 
USB Host, die ohne RTOS nur schwer umsetzbar sind.

Niklas G. schrieb:
> Präemptives Multithreading ist außerdem schwierig sicher handzuhaben
> durch Race Conditions, Deadlocks & Co - es ist sehr leicht, subtile
> Fehler einzubauen, die nur sehr selten auftreten und kaum zu finden
> sind.

Natürlich kann es Probleme geben, aber dem würde ich nicht zustimmen. 
Ansonsten würden RTOS ja nicht in sicherheitskritischen Produkten 
eingesetzt werden.

Was ich in der Praxis eher sehe, ist, dass manche Entwickler sich ihren 
eigenen Scheduler entwickeln, weil auch ihre komplexe Applikation 
Echtzeitanforderungen hat. Aber dann kann man auch direkt ein RTOS 
einsetzen

von Harald K. (kirnbichler)


Lesenswert?

Arduino F. schrieb:
> Nein, habe ich nicht!


Dann zeig' doch mal Deine for-Schleife, die nicht Deine Protothreads 
blockiert.

Sieht die so aus wie eine stinknormale for-Schleife?

Oder eher doch nicht?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Til S. schrieb:
> Aus Sicht des RTOS ist das alles Applikation, d.h., ob ein Filesystem
> läuft oder deine Applikation ist dem RTOS egal. Wenn z.B. das Filesystem
> in mehreren Tasks genutzt werden soll, muss es thread-safe sein.
Diese Anforderung bedingt, dass für jede Task/Thread ein Stack Bereich 
reserviert werden muss.
Damit ist der Speicher die begrenzende Ressource.
Wenn da kein Mange herrscht, dann gut.

Aber:
4 Tasks auf einem ATMega328p, da dürfte dann irgendwo die Grenze sein.
Das ist nicht viel.
Zudem sind die Unmengen Push und Pop nicht gerade ein Beschleuniger.

Auch war die Eingangsfrage:
Niklas G. schrieb:
> aber eben kein präemptives Scheduling haben möchte,

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Harald K. schrieb:
> Dann zeig' doch mal Deine for-Schleife, die nicht Deine Protothreads
> blockiert.
Erstens: Du kennst die Protothreads nicht.
Sonst wüsstest du das, wie das geht.

Zweitens: Das interessiert dich überhaupt nicht!
Denn sonst würdest du dir die Abhandlungen des Herren Dunkels mal 
durchgelesen haben, bevor du so ein dummes Zeugs blubberst.

Offensichtlich glaubst du mir nicht.
Das ist eigentlich ok.
Aber schade, dass du das nicht selber gegenprüfen möchtest.

Beispiel:
For Schleife mit Adruino delay() Drop in Ersatz und dazu mit einer 
Endlosschleife garniert.
1
// Grundsaetzliche Annahme (-: es "mag" Ausnahmen geben ;-)
2
constexpr bool stromausfall {false};
3
4
class Piepser : public Task
5
{
6
  protected:
7
   int i; 
8
   bool &piepflag;
9
   
10
  public:
11
    Piepser(bool &piepflag):i(0),piepflag(piepflag){}
12
13
    virtual void run() override // 5 mal piepsen, wenn Flag gesetzt
14
    {
15
       
16
      TaskBlock
17
      {
18
        while(not stromausfall)
19
        {
20
          taskWaitFor(piepflag);
21
          for(i = 0; i < 5; i++) 
22
          {
23
             Serial.println(F("Piep"));
24
             //taskSwitch();
25
             taskPause(200); / ms
26
          }
27
          piepflag = false; // fertig mit piepsen (Flag konsumieren)
28
        }
29
      }
30
    }
31
};

1 bis 2 Dutzend Tasks auf einem Uno durchaus machbar.
ca 100000 Durchläufe pro Sekunde bei 4 bis 5 Tasks

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Arduino F. schrieb:
> Erstens: Du kennst die Protothreads nicht.
> Sonst wüsstest du das, wie das geht.
>
> Zweitens: Das interessiert dich überhaupt nicht!

Du bist irgendwo ganz, ganz falsch abgebogen. Und wirfst jetzt 
krampfhaft mit Beleidigungen und haltlosen Unterstellungen um Dich.

Was Du da zeigst, ist halt keine simple for-Schleife mehr, sondern eine, 
die nach jedem Durchlauf eine zusätzliche Funktion ("taskPause") 
aufruft, um eben anderen Threads Rechenleistung zukommen zu lassen.

Wenn Du das bei Deiner Programmierung berücksichtigst, ist ja alles gut, 
nur widersprichst Du Deinen Pauschalaussagen hier:

Arduino F. schrieb:
> Wenn irgendwas X mal gemacht werden soll, dann will ich da eine zählende
> for Schleife sehen.
> Ohne wenn und aber!
>
> Ebenso eine Endlosschleife, wenn irgendwas dauerhaft getan werden soll.
> z.B. so: while(not stromausfall) tuwas();

Deine Endlosschleife funktioniert nur dann, wenn entweder zusätzlich zu 
"tuwas" eine Funktion analog zu "taskPause" aufgerufen wird, oder aber 
"tuwas" das macht.

Das ist der essentielle Unterschied, auf den man eben achten muss.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Harald K. schrieb:
> Beleidigungen und haltlosen Unterstellungen um Dich.

Wie?
Du hast doch gezeigt, dass du die Protothreads nicht kennst und dich 
nicht kundig gemacht hast.
Wie kann das beleidigend sein, wenn man das klar so benennt?

Ja, ich bin enttäuscht von dir, da hätte ich mehr erwartet.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Arduino F. schrieb:
> Wie?
> Du hast doch gezeigt, dass du die Protothreads nicht kennst und dich
> nicht kundig gemacht hast.

Das habe ich nicht gezeigt. Das hast Du -völlig falsch- in meine Aussage 
hineininterpretiert.

Wie wäre es, an Deinem Textverständnis zu feilen?

von Til S. (Firma: SEGGER) (til_s)


Lesenswert?

Arduino F. schrieb:
> Diese Anforderung bedingt, dass für jede Task/Thread ein Stack Bereich
> reserviert werden muss.
> Damit ist der Speicher die begrenzende Ressource.
> Wenn da kein Mange herrscht, dann gut.

Ja, richtig, jede Task läuft auf ihrem eigenen Taskstack und dafür 
braucht man genügend Speicher. Die Größe des Taskstacks hängt von dem 
Code in der Task ab. Der Taskstack muss z.B. größer sein, wenn mehr 
lokale Variablen und Unterprogrammaufrufe genutzt werden.
Wir haben Kunden, die embOS auf einem 8051 mit 2 kByte RAM 
einsetzen...da wundert man sich schon ein bisschen ;-).

Arduino F. schrieb:
> Zudem sind die Unmengen Push und Pop nicht gerade ein Beschleuniger.

Du meinst wahrscheinlich den Taskwechsel. Dazu kommt dann auch noch die 
Laufzeit des Schedulers.

Man muss das wahrscheinlich ein bisschen differenzieren. Nicht jede 
Applikation braucht ein RTOS und nicht jeder Mikrocontroller hat dafür 
genug Leistung und Speicher. Aber Mikrocontroller werden immer 
leistungsfähiger und haben mehr Speicher. Daher werden komplexere 
Applikationen ausgeführt, die mehr Echtzeitanforderungen haben. Der 
Overhead des RTOS ist dann im Vergleich zu den Vorteilen 
vernachlässigbar.

von J. S. (jojos)


Lesenswert?

Wenn es dem TO um solche Komponenten geht:

> Allerdings haben heutige RTOSe (z.B. Zephyr, RT-Thread usw) ja eine
> große Anzahl an zusätzlichen Komponenten und Middlewares wie z.B.
> Networking, Dateisysteme, Power Management, Treiber für externe interne
> & externe Peripherie, Kryptographie, OTA-Updates usw.

wird es ihm wohl kaum um kleine AVR gehen.

Da würde ich allerdings auch nicht auf einen präemptiven Scheduler 
verzichten wollen. Ein RTOS zeichnet sich nicht nur durch garantierte 
Antwortzeiten aus, die Tasks/Threads haben auch verschiedene Prioritäten 
die eine Programmstruktur vereinfachen.

von Andreas M. (amesser)


Lesenswert?

Arduino F. schrieb:
> Harald K. schrieb:
>> Dann zeig' doch mal Deine for-Schleife, die nicht Deine Protothreads
>> blockiert.
> Erstens: Du kennst die Protothreads nicht.
> Sonst wüsstest du das, wie das geht.

"taskPause", "taskWaitFor" sind nichts weiteres als in Deiner 
Applikation explizit gesetzte Unterbrechungspunkte an denen Du die 
Kontrolle zurück an den "Protothread Scheduler" übergibst. (Im Endeffekt 
steht da ein "return") Und das ist genau das, was Harald mit seiner 
Aussage meinte: Wenn man ein deartig implementiertes kooperatives 
Multitasking einsetzt, dann muss die Applikation dafür geschrieben sein, 
sonst funktioniert das nicht. Wenn du nämlich "taskPause" und 
"taskWaitFor" weg lässt, naja, den Rest weist Du sicher selbst. Und hier 
entsteht das Problem wenn man fertige Bibliotheken einsetzen will, z.b. 
fürs Dateisystem. Würde man einen Aufruf von "open(...)" in Deine 
Schleife einsetzen, dann würde er an der Stelle gemütlich alle I/O 
Operationen (z.B SPI) abwarten und durcharbeiten bevor er aus der "open" 
Funktion überhaupt zurückkommt. Und das würde mit read/write so 
weitergehen. Erst dann wenn die Applikation explizit die Kontrolle an 
den Protothread Scheduler zurückgibt würde überhaupt erst eine andere 
"Task" dran kommen können, die sogenannte Parallelität geht dann ganz 
schnell flöten (Kommt drauf an wie zeitkritisch die einzelnen Aufgaben 
sind)

Im Gegensatz dazu kann ein echtes Multitasking OS eine Task zu jedem 
beliebigen Zeitpunkt unterbrechen und was anderes laufen lassen, dafür 
werden keine Unterbrechungspunkte gebraucht. Somit kann dann (im Prinzip 
beliebiger) Code dem System zugefügt werden ohne den Rest des Systems zu 
stören oder das Zeitverhalten zu beeinflussen.

von Harald K. (kirnbichler)


Lesenswert?

Andreas M. schrieb:
> echtes Multitasking OS

Ich würde den Unterschied zwischen kooperativem und präemptiven 
Multitasking nicht verwenden, um zwischen "echtem" und "unechtem" 
Multitasking zu unterscheiden. Auch kooperativ ist sehr wohl echtes 
Multitasking möglich (entsprechende Disziplin und Sorgfalt seitens des 
Programmierers vorausgesetzt).

Ja, ein präemptives Multitasking macht das ganze sehr viel leichter, 
wiederum vorausgesetzt, der Programmierer schafft es, bei der 
Synchronisation seiner Threads keine Verknotungen (Deadlock, Race 
Condition etc.) zu basteln.

von Rbx (rcx)


Lesenswert?

Niklas G. schrieb:
> Wenn ich also diese zusätzlichen Komponenten/Libraries nutzen möchte,
> aber eben kein präemptives Scheduling haben möchte, hat man kaum eine
> Option, richtig?

Irgendwie ist die Frageform hier kacke. Aktuelle Forschungen gehen da 
wohl eher in Richtung Stromsparen?

"In spite of this large application domain, most of the current 
real-time systems are still designed and implemented using low-level 
programming and empirical techniques, without the support of a 
scientific methodology. This approach results in a lack of reliability, 
which in critical applications may cause serious environmental damage or 
even loss of life."

Würdest du sagen, dass diese Thematik mit den oben angesprochen 
Problemen eine passende in einem Lämpchen-Blinken-lassen-Forum ist?

Mit solchen Fragen geht man an die Uni, fragt viele Leute, macht sich 
eine Leseliste zum Abarbeiten und macht sich selber ein paar Notizen und 
Gedanken - bis man merkt, dass man keine Ansprechpartner mehr hat, und 
ein Kommunikationsproblem.
Falls man selber an der Uni lehrt, hätte man natürlich auch ein 
supergutes Thema zum Veröffentlichen.

Früher hätte man sogar nach Pisa pilgern können, um die Vorlesungen von 
diesem  Buttazzo zu besuchen.

(Wenn man ein paar Wiki-Seiten zur Jupitersonde Juno durchliest, weiß 
man immer noch nicht, wer die Sonde wie und womit programmiert hat.)

von Harald K. (kirnbichler)


Lesenswert?

Rbx schrieb:
> "In spite of this large application domain, most of the current
> real-time systems are still designed and implemented using low-level
> programming and empirical techniques, without the support of a
> scientific methodology. This approach results in a lack of reliability,
> which in critical applications may cause serious environmental damage or
> even loss of life."

Welche Quelle hast Du da zitiert? Klingt ja gar nicht voreingenommen, 
das.

von Rbx (rcx)


Lesenswert?

Harald K. schrieb:
> Welche Quelle hast Du da zitiert? Klingt ja gar nicht voreingenommen,
> das.

https://link.springer.com/book/10.1007/978-1-4614-0676-1

von 900ss (900ss)


Lesenswert?

Rbx schrieb:
> "In spite of this large application domain, most of the current
> real-time systems are still designed and implemented using low-level
> programming and empirical techniques, without the support of a
> scientific methodology. This approach results in a lack of reliability,
> which in critical applications may cause serious environmental damage or
> even loss of life."

Das klingt mir sehr subjektiv und schlecht informiert/recherchiert vom 
ursprünglichen Autor dieser Zeilen. Wenn Menschenleben betroffen sind, 
gibt es sehr strenge Vorgaben für die Software in kritischen 
Applikationen wenigstens im Maschinenbau, Luft- & Raumfahrt. Ich vermute 
in der Autoindustrie oder gar Medizin ist es nicht anders. Da wird 
nichts empirisch programmiert. Das ist schlicht Unsinn.

: Bearbeitet durch User
von Til S. (Firma: SEGGER) (til_s)


Lesenswert?

> This approach results in a lack of reliability,
> which in critical applications may cause serious environmental damage or
> even loss of life."

Ich halte die Aussage auch für schwierig.

900ss schrieb:
> Wenn Menschenleben betroffen sind,
> gibt es sehr strenge Vorgaben für die Software in kritischen
> Applikationen wenigstens im Maschinenbau, Luft- & Raumfahrt. Ich vermute
> in der Autoindustrie oder gar Medizin ist es nicht anders.

Ja, ist bei Automotive und Medizin nicht anders. In der ISO 26262 bzw. 
IEC 62304 sind die Anforderungen an die Software genau beschrieben.

Ein RTOS wie z.B. embOS-Safe oder SafeRTOS müssen nach diesen Normen 
zertifiziert werden, um im Fahrzeug oder im Medizinprodukt genutzt 
werden zu können.

Diese Zertifizierung muss aber der Entwickler nicht selber machen, 
sondern das machen oft bereits die RTOS Hersteller, so dass man ein 
"pre-certified" RTOS nutzen kann.

von Max M. (maxi123456)


Lesenswert?

Wann und wofür benutzt ihr eigentlich ein RTOS? In 10 Jahren Arbeitswelt 
und auch privater Bastelleien hatte ich noch nie das Bedürfnis nach 
einem RTOS.

Aber ich programmiere vermutlich auch keine HF Echtzeit Anwendungen.

von Til S. (Firma: SEGGER) (til_s)


Lesenswert?

Max M. schrieb:
> Wann und wofür benutzt ihr eigentlich ein RTOS?
In den letzten knapp 17 Jahren benutzen eher weniger...mehr das RTOS 
entwickeln ;-).

Ein RTOS macht immer da Sinn, wo die Applikation komplexer ist, und 
mehrere Aufgaben quasi parallel mit unterschiedlichen 
Echtzeitanforderungen abgearbeitet werden sollen.

Sagen wir, eine fiktive Anwendung soll irgendwelche Daten per TCP/IP 
austauschen und per GUI/Touch bedienbar sein. Der TCP/IP Stack und der 
Datenaustausch können in Tasks mit niedriger Priorität laufen, weil sie 
keine hohen Echtzeitanforderungen haben. Ob die Daten ein paar 
Millisekunden später ankommen, ist in dieser fiktiven Anwendung egal.
Die GUI Task hat aber hohe Echtzeitanforderungen und sollte eine hohe 
Taskpriorität bekommen. Wenn der Benutzer das Touch bedient und auf dem 
Display passiert nichts, weil gerade Code des TCP/IP Stacks abgearbeitet 
wird, ist das suboptimal.

Das RTOS hilft einem ungemein bei dem Timing und den 
Echtzeitanforderungen.
Natürlich geht das auch irgendwie ohne RTOS, aber ab einer gewissen 
Komplexität der Anwendung nur mit sehr viel mehr Aufwand.

Dazu kommen noch andere Aspekte wie z.B. Energie sparen aber das führt 
hier zu weit.

von Oliver S. (oliverso)


Lesenswert?

Oh je...

Wer schon für eine ausreichende Schwuppdizität eines Guis ein Rtos 
benötigt, macht irgend etwas sehr grundlegend verkehrt.

Multithreading und Multitasking haben erstmal gar nichts mit "real time" 
zu tun. Selbst das selige Windows 3.1 konnte TCP/IP und Gui 
"gleichzeitig", obwohl das nun wirklich gar nichts von sich aus 
gleichzeitig konnte.

Oliver

von Harald K. (kirnbichler)


Lesenswert?

Oliver S. schrieb:
> obwohl das nun wirklich gar nichts von sich aus
> gleichzeitig konnte.

Das konnte kooperatives Multitasking, damit hat es seine GUI verwaltet. 
TCP lief irgendwo im schmutzigen Hintergrund, mit Interrupts oder wie 
auch immer.

von Rbx (rcx)


Lesenswert?

900ss schrieb:
> Das klingt mir sehr subjektiv und schlecht informiert/recherchiert vom
> ursprünglichen Autor dieser Zeilen.

Fass dich an deine eigene Nase, bevor du hier auf andere zeigst. Ein 
paar Beispiele hat der Autor auch, die dann aber eher in Richtung Bugs 
aufgrund der Komplexität des schlecht wartbaren Codes gehen.

von Oliver S. (oliverso)


Lesenswert?

Harald K. schrieb:
> Das konnte kooperatives Multitasking

Bei Windows 3.1 ist die Aussage aber doch eher ein Euphemismus.

Aber egal, es ändert nichts daran, dass selbst preemtives Multitasking 
erst einmal nichts mit Real time zu tun hat.

Oliver

von Harald K. (kirnbichler)


Lesenswert?

Oliver S. schrieb:
> Bei Windows 3.1 ist die Aussage aber doch eher ein Euphemismus.

Nein, ganz und gar nicht. Das ist kein Euphemismus, sondern echtes 
kooperatives Multitasking.

Wenn man das (auf 386ern verfügbare) Multitasking von DOS-Prozessen 
parallel zur Windows-GUI meint - das ist kein kooperatives Multitasking, 
das ist präemptives Multitasking.

Kooperatives Multitasking über die Windows-Message-API haben schon viel 
ältere Windows-Versionen betrieben.

Wenn es gehakelt hat, dann lag das an schlecht geschriebenen Programmen 
- und nichts gibt es in der Windows-Welt mehr als schlecht geschriebene 
Programme. Das war zu 16-Bit-Zeiten so (wo es den kompletten Betrieb 
lahmlegen konnte), das ist aber auch heute noch so, nur wird heute viel, 
viel mehr Aufwand betrieben, die Auswirkungen abzufangen.

Kooperativ war übrigens auch das Multitasking der alten MacOS-Varianten 
(alles vor OS X).

von 900ss (900ss)


Lesenswert?

Rbx schrieb:
> Fass dich an deine eigene Nase, bevor du hier auf andere zeigst

Ich habe bzw. arbeite in zwei von den von mir genannten Bereichen und 
habe deshalb "etwas" Wissen. Deshalb fällt es mir schwer die Aussage des 
Autors als glaubhaft anzuerkennen. Selbst wenn mal etwas "durchrutscht" 
trotz aller Regelarien, ist das noch länger nicht zu verallgemeinern, so 
wie in den Buch geschehen. Trotz möglicher Beispiele...

Und immer freundlich bleiben gelle :)
Nase und so....

von Rbx (rcx)


Lesenswert?

Oliver S. schrieb:
> Aber egal, es ändert nichts daran, dass selbst preemtives Multitasking
> erst einmal nichts mit Real time zu tun hat.

Tatsächlich kommen hier erst die Problem ins Spiel. Ein verlässliches 
Timing wie beim Atari ST oder wie bei DOS gab es jetzt nicht mehr - wie 
auch die einfache Hardwarezugänglichkeit/Schnittstelle nicht mehr. Und 
ohne richtiges DOS ist die Hardwarezugänglichkeit teilweise noch 
schlimmer.
Teilweise deswegen, weil die DOS-Emulation in Vista doch recht gut ging 
und bei alten Programmen weniger Probleme machte als die alten Kisten. 
Damals gab es aber noch andere potentielle Sorgenkinder wie z.B. DPMI - 
und ähnlich wie bei der Frage "welches Linux nehme ich denn?" drehten 
sich die Fragen damals um VGA oder FPU oder was immer -
Und aktuell steht ja auch so ein wenig Directx in Frage oder die 
Windowsversion selber.
Toll, wenn dann die hochqualititative Audiokarte keinen Direktx-Treiber 
oder Directx-Funktionalität mitbringt.
->
Da kam dann damals Ubuntu-Studio - und auf die RTOS brauchte man dann 
auch nicht mehr lange warten.
Ein Cubase für FreeDOS wäre eigentlich auch ganz nett gewesen.
https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Harald K. schrieb:

> Nein, ganz und gar nicht. Das ist kein Euphemismus, sondern echtes
> kooperatives Multitasking.

So ist es und das gab es sogar noch sehr viel länger als Windows3.x in 
Form der diversen Varianten von "embedded Windows", die ich mal 
(vereinfachend) als "WindowsCE" zusammen fassen würde.

Da hat das auch einen Sinn ergeben, denn das lief auf teils wirklich 
recht mickrigen Architekturen und in vielen der damaligen Anwendungen 
braucht es obendrein tatsächlich RT-Eigenschaften.

Noch heute sind weltweit mindestens zehntausende, wenn nicht gar 
hunderttausende kleine Werkzeugmaschinen mit WindowsCE-Steuerung im 
Einsatz.

von Harald K. (kirnbichler)


Lesenswert?

Rbx schrieb:
> Tatsächlich kommen hier erst die Problem ins Spiel. Ein verlässliches
> Timing wie beim Atari ST oder wie bei DOS gab es jetzt nicht mehr - wie
> auch die einfache Hardwarezugänglichkeit/Schnittstelle nicht mehr. Und
> ohne richtiges DOS ist die Hardwarezugänglichkeit teilweise noch
> schlimmer.

DOS hatte gar kein Timing, und "Hardwarezugänglichkeit" scheiterte sehr 
oft schon am technischen Verständnis der Programmierer. Was ich an 
vergurkten Interpretationen der Ansteuerung einer seriellen 
Schnittstelle gesehen habe, geht auf keine Kuhhaut.

Rbx schrieb:
> Ein Cubase für FreeDOS wäre eigentlich auch ganz nett gewesen.
> https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel

Und womit sollte das mit welcher Hardware reden?

von Bruno V. (bruno_v)


Lesenswert?

Oliver S. schrieb:
> Aber egal, es ändert nichts daran, dass selbst preemtives Multitasking
> erst einmal nichts mit Real time zu tun hat.

Oliver S. schrieb:
> Wer schon für eine ausreichende Schwuppdizität eines Guis ein Rtos
> benötigt, macht irgend etwas sehr grundlegend verkehrt.

RTOS wird im embedded-Bereich als Synonym für Multitasking verwendet. 
Egal ob preemtiv, kooperativ, mit und ohne Prioritäten oder Round Robin.

Dein Begriff von RTOS wird meist mit "hart" qualifiziert. Das nutzen 
relativ wenige.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Harald K. schrieb:
> DOS hatte gar kein Timing
Falsch!
Es hat(te) einen 18,xxHz timer tick.
In dem man sich z.B. per TSR einhängen kann/konnte/musste

von 900ss (900ss)


Lesenswert?

Bruno V. schrieb:
> Dein Begriff von RTOS wird meist mit "hart" qualifiziert. Das nutzen
> relativ wenige.

Genau. Ein RTOS im embedded Bereich ist Regel erstmal "nur" ein OS. Ob 
dessen realtime Fähigkeiten wirklich ausgenutzt /gebraucht werden hängt 
halt vom Anwendungsfall ab.

von Harald K. (kirnbichler)


Lesenswert?

Arduino F. schrieb:
> Falsch!
> Es hat(te) einen 18,xxHz timer tick.

Wenn Du das schon als "Timing" betrachten willst, bitte. Das war halt 
der Timerinterrupt des 8254.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Arduino F. schrieb:
> Harald K. schrieb:
>> DOS hatte gar kein Timing
> Falsch!
> Es hat(te) einen 18,xxHz timer tick.
> In dem man sich z.B. per TSR einhängen kann/konnte/musste

Wenn du das als MT rechnest, war DOS tatsächlich ein MT-System. 
Schließlich konnte sich jede Anwendung in jeden Interrupt einhängen.

Nur halt: ohne jede Unterstützung von DOS selber. Deswegen neige ich 
doch eher dazu DOS nicht als MT-OS zu betrachten...

von Bruno V. (bruno_v)


Lesenswert?

Ob S. schrieb:
> tatsächlich ein MT-System.
> Schließlich konnte sich jede Anwendung in jeden Interrupt einhängen.

Interrupts sind die Emulation von MT und RT. Der Ticker für zyklische 
Tasks, Scheduler über SW-Interrupts, HW-Interrupts als Semaphoren etc.

Oft braucht man erst dann ein MT, wenn man an verschiedenen Stellen 
warten will.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Bruno V. schrieb:

> Interrupts sind die Emulation von MT und RT. Der Ticker für zyklische
> Tasks, Scheduler über SW-Interrupts, HW-Interrupts als Semaphoren etc.

So ein vollendeten Quatsch habe ich je selten zuvor jemals gehört.

Nein, es ist natürlich genau anders herum: Interrupts sind das, was 
REAL existiert.

Zu was MT-OS die dann verwursten, hängt vom OS ab. Recht typisch für 
alle Ernstzunehmenden ist allerdings, dass sie Anwendungen nicht mehr 
direkt an die Interrupts ranlassen. Weil: wäre es anders, könnte sowas 
wie etwa RT-Anforderungen nur schwerlich garantiert werden.

von Bruno V. (bruno_v)


Lesenswert?

Ob S. schrieb:
> Nein, es ist natürlich genau anders herum: Interrupts sind das, was
> REAL existiert.

Ich kenne Deine Embedded Erfahrung nicht. Wenn Du Dir ein paar Deiner 
Projekte ohne MT ansiehst und Dir anschaust, wie Du es mit machen 
würdest, siehst Du oft die 1-1 Relation.

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.