Go Down

Topic: FreeRTOS oder einfach Timer?  (Read 2358 times) previous topic - next topic

JoaMei

Hallo liebe hilfsbereite Menschen,

ich habe grade FreeRTOS entdeckt bzw. ein netter Mensch hat mich darauf hingewiesen.

Mein Problem ist das versenden von CAN-Botschaften mit 10 ms, 100 ms und 1 s Cycle Time. Momentan läuft es mit einem Timer (TimerOne) der im 1 ms Takt aufgerufen wird, da läuft ein Zähler mit. Mit if und Modulo bestimme ich dann die Sendezeitpunkte. In der Loop werden ankommende Botschaften verarbeitet. Funktioniert auch eigentlich ganz gut.

Ein Echtzeitbetriebssystem wäre hier aber evtl. besser geeignet wurde mir von fachkundiger Seite dazu gesagt. Nun habe ich aber gelesen dass in FreeRTOS auf dem Arduino minimal in 15 ms Tasks gearbeitet werden kann. Und den Buffer für ankommende Nachrichten müsste ich evtl. auch öfter als das auslesen, z.B. per Hardware Interrupt.

Habe ich das Konzept falsch verstanden? Geht es auf anderen Mikrocontrollern schneller? Was ist die beste Lösung für solche getimeten Ereignisse die etwas schneller stattfinden als die Tasks im RTOS oder die nicht genau dem Vielfachen eines Tasks entsprechen?

MfG und vielem Dank

Christian

Tommy56

Der ESP32 arbeitet mit freeRTOS. Da wirst Du aber andere Entwicklungswerkzeuge nutzen müssen, denn die Unterstützung der Arduino-IDE ist noch nicht voll ausgebaut.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

michael_x

#2
Mar 22, 2018, 08:16 pm Last Edit: Mar 22, 2018, 08:28 pm by michael_x
Was ist für dich ein Arduino?
Wenn du etwas meinst das per Arduino-IDE programmiert wird, kannst du zwar auf allerlei Arten sowas wie Tasks erzeugen,  aber besser, was Performance angeht,  kannst du durch zusätzliche Software nicht werden. Da ist der Komfort den die IDE bietet, schon Aufwand,  den dein "Arduino" verkraften muß.

Wenn ich dich richtig verstehe, verwendest du eine Extra-Library um 1ms Intervalle zu zählen?
Witzig eigentlich.  Dann kannst du gern auch etwas noch aufwendigeres draufsatteln ;)

DrDiettrich

#3
Mar 23, 2018, 08:13 am Last Edit: Mar 23, 2018, 08:20 am by DrDiettrich
Multitasking und Echtzeit ist eigentlich ein Widerspruch in sich, auf einem µC mit nur 1 Kern. Da können die Tasks nur abwechselnd scheibchenweise bearbeitet werden. Wenn FreeRTOS da 15ms pro Scheibe vorsieht, und eine Scheibe nicht vorzeitig freigegeben werden kann (yield), dann siehst Du die Grenzen für so einen Ansatz. Ganz abgesehen davon, daß das Multitasking eines Echtzeit-Betriebssystems schon einen großen Controller erfordert, der mehrere Stacks nutzen und Tasks beliebig aktivieren und stilllegen kann.

Wenn es aber nur darum geht, auf eine bestimmte Zeit zu warten, zu der eine Botschaft verschickt werden soll, dann kann das auch der kleinste Arduino erledigen, auch für viele Botschaften. Entweder nach dem Strickmuster "Blink without delay" oder Nachtwächter-Modell, oder auch mit Task Makros, wenn Dir Tasks lieber sind. In Deinem Fall könnte das "Hauptprogramm" so aussehen:
Code: [Select]
void loop() {
 every(1) tu1(); //alle Millisekunden
 every(10) tu10(); //alle 10ms
 every(100) tu100(); //alle 100ms
}

combie

Quote
Multitasking und Echtzeit ist eigentlich ein Widerspruch in sich, auf einem µC mit nur 1 Kern.
Kannst du das auch belegen?
Bedenke dabei, dass FreeRTOS auch preemptives Multitasking auf AVRs unterstützt.


Womit ich allerdings nicht sagen möchte, dass hier FreeRTOS das Mittel der Wahl ist.
Eher im Gegenteil, ich würde auch versuchen auf die "Strickmuster" mit millis() oder/und Timer zurück zu greifen.


Hier einer der vielen RTOS Ansätze.
Halte ich für durchaus lesenswert.
Ob man das dann auch so macht, ist eine ganz andere Frage.
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

RIN67630

#5
Mar 23, 2018, 08:48 am Last Edit: Mar 23, 2018, 09:00 am by RIN67630
Multitasking und Echtzeit ist eigentlich ein Widerspruch in sich, auf einem µC mit nur 1 Kern. Da können die Tasks nur abwechselnd scheibchenweise bearbeitet werden. Wenn FreeRTOS da 15ms pro Scheibe vorsieht, und eine Scheibe nicht vorzeitig freigegeben werden kann (yield), dann siehst Du die Grenzen für so einen Ansatz. Ganz abgesehen davon, daß das Multitasking eines Echtzeit-Betriebssystems schon einen großen Controller erfordert, der mehrere Stacks nutzen und Tasks beliebig aktivieren und stilllegen kann.
Nein. Multitasking und Echtzeit hatten wir mit RTOS schon auf dem Intel 8008 ende der 70er.
FreeRTOS erfordert nur wenige CPU-Ressourcen und keineswegs mehrere Kerne.
Es arbeitet präemptiv, d.h. es kann, wie ein Interrupt, ein länger andauerndes Task unterbrechen, um ein höherprioritiertes Task den Vorrang zu lassen. Hier bedarf es kein yield().

Aber es verlangt ziemlich viel Speicher für den software-Heap. Hier sind bei kleinere Arduinos schnell die Grenzen spürbar. Ein DUE fühlt sich da schon viel wohler...

RIN67630

Kannst du das auch belegen?
Bedenke dabei, dass FreeRTOS auch preemptives Multitasking auf AVRs unterstützt.


Womit ich allerdings nicht sagen möchte, dass hier FreeRTOS das Mittel der Wahl ist.
Eher im Gegenteil, ich würde auch versuchen auf die "Strickmuster" mit millis() oder/und Timer zurück zu greifen.


Hier einer der vielen RTOS Ansätze.
Halte ich für durchaus lesenswert.
Ob man das dann auch so macht, ist eine ganz andere Frage.

Für die Belange des OPs wäre ein LoLin32 viel besser geeignet. Die CAN-Lib dafür gibt es schon...
http://www.iotsharing.com/2017/09/how-to-use-arduino-esp32-can-interface.html

DrDiettrich

Mit entsprechenden Einschränkungen kann man Multitasking auch auf kleinen Prozessoren implementieren, z.B. mit Task Makros. Bei den 8 Bit AVR sind die Einschränkungen für ein RTOS aber so groß, daß jemand ohne Kenntnis dieser Einschränkungen heftig auf die Schnauze fliegt, wenn er versucht, seine Tasks dort unter einem RTOS zum Laufen zu kriegen. Daher sollte man IMO überhaupt erst garnicht versuchen, ein OS auf so einem Controller zu installieren, wenn man damit mehr als nur wissenschaftliche Neugier befriedigen will.

Go Up