ist teensythread auf dem 4.0 verfügbar, echt preemptiver scheduler, mit unterschiedlich konfigurierbaren thread prios (wie pthread/std::thread auf Pi oder std::thread auf ESP32) ?
ist teensythread auf dem 4.0 verfügbar, echt preemptiver scheduler, mit unterschiedlich konfigurierbaren thread prios (wie pthread/std::thread auf Pi oder std::thread auf ESP32) ?
Da müsste man mal den 159-seitigen Betatest-Thread im Teensy Forum durchkämmen. Leider ist die Suchfunktion da nicht so nützlich.
Alternativ im Verzeichnis nachschauen, wenn in Kürze die Teensy Software 1.47 kommt. Da sollte alles drin sein, was es bisher gibt. Meine Vermutung ist, dass TeensyThreads nur eine Anpassung der bisherigen Version ist. Ist das nicht kooperatives Multitasking ? Ich weiß, dass es die Lib gibt, benutzt habe ich die noch nicht.
Auf einem Teensy kann auch viel über DMA erledigt werden, das läuft dann weitgehend unabhängig vom Prozessorkern. Manche Libs machen das intern, von manchen gibt es Varianten mit DMA, selber machen ist leider mit viel Lernaufwand verbunden.
Um Dinge zyklisch mit hoher Priorität parallel zum normalen Programm abzuarbeiten, eignen sich auf dem Teensy vor allem die Timer, z.B. hiermit
https://www.pjrc.com/teensy/td_timin...rvalTimer.html
Hier ein paar Hintergründe zum Thema
https://forum.pjrc.com/threads/28714...ll=1#post73823
bezogen auf den 3.1, die größeren haben von manchen Timer Sorten ein paar mehr. Beim 4.0 sind wohl ein paar Unterschiede mehr, aber die wichtigen Libs sind darauf angepasst.
der Nachteil von Timern ist, dass sie üblicherweise nicht multiple langdauernde, ununterbrochene Operationen zulassen. Selbst kooperatives MT funktioniert nicht mehr, wenn einzelne Threads plötzlich in einer langen Berechnung (exemplarisch: fibonacci(43) rekursiv) hängen oder blockieren.
Preemptives MT dagegen kann einfach die Zeitscheibe nach Sichern aller Variablen und Register etc unterbrechen und dann die nächste Zeitscheibe für den nächsten Prozess starten (round robin), auch wenn kein yield() drin war und die Berechnungen oder die Datenübertragung noch nicht fertig sind.
Ein temporäres oder dauerhaftes Blockieren oder ununterbrochene Aktivitäten von einem oder auch mehreren Threads verhindern daher nicht die weitere Ausführung der übrigen Threads.
Daher ist für mich ein preemptives MT unverzichtbar, wie es bei Raspberry Pi (C/pthread), ESP32 (C++/std::thread auf RTOS Basis, etwas eingeschränkt) oder Lego Mindstorms (RCX/NQC, NXT/NXC, EV3/C/pthread) möglich ist.
Anmerkung: Für den ESP32 ist eine Minimalimplementation von pthread verfügbar. Diese basiert auf FreeRTOS's Tasksystem. Std::thread, std::async etc. wiederum sind ein Abstraktionslayer basierend auf pthread (Quelle).
ja, das ist das was ich oben gemeint habe, ich kenne und nutze es beim ESP32 auch bereits. Man kann thread prios von 0-5 definieren, für potentiell blockierende threads empfiehlt sich 0, und es funktioniert sehr gut bis jetzt. Ich hatte hier auch schon ein Beispielprogramm gepostet zu Testzwecken:
https://www.roboternetz.de/community...l=1#post653989
- - - Aktualisiert - - -
PS
korrigiert:
sogar auch std::mutex ist für ESP32 vorhanden
Code:#include <mutex> std::mutex print_mutex; void mtxPrintln(String str) // String: Arduino API // C++: std::string { print_mutex.lock(); Serial.println(str); print_mutex.unlock(); }
Das verstehe ich nicht. Wenn ich einen Timer verwende, löst der einen Interrupt aus, der selbstverständlich das laufende Programm unterbricht.
Das wird von einem Timer und seinem Interrupt gesteuert. Wie sollte sonst der Scheduler auf die nächste Task umschalten können?Preemptives MT dagegen kann einfach die Zeitscheibe nach Sichern aller Variablen und Register etc unterbrechen und dann die nächste Zeitscheibe ...
Die hardwarenahen Systeme, die ich so baue, haben alle entweder einen dediziert laufenden Timer mit Interrupt oder hängen an einem für die Hardware notwendigen Timer, z.B. dem PWM Timer eines Motors. Dazu kommen dann noch die Interrupte der übrigen Peripherie. Das gibt mir ausreichend Nebenläufigkeit, daß ich Threads und den dazu gehörenden Scheduler bisher nicht vermisst habe.
Auch würde mir ein preemptives System gar nicht passen. Wenn ich schnell reagieren muß z.B. einen PID Regler vor dem nächsten PWM-Takt fertigrechnen oder ein CRC bevor das Transmit Register leer ist, darf mir kein Scheduler dazwischen funken. Und sollte einer meiner Interrupthandler hängen, hat meine SW einen grundlegenden Bug. Dann wird mein PID Regler nie richtig funktionieren oder das CRC nie richtig berechnet werden.
Der Vergleich zwischen einem PI mit einem Multitasking System wie Linux/Unix (wo man in jeder Task natürlich auch noch mal lightweight Tasks aka Threads haben kann) und einem Teensy mit einerm Arduino Framework hinkt an allen Ecken und Kanten.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Wenn ich bei 2MHZ Sample Rate ein 800kHz Signal sampeln will, kann ich bequem nebenbei noch eine UI steuern, solange ich DMAs damit beschäftige die Daten zu schaufeln ohne dass ich auch nur die Bohne Threading benötige.
Und wenn mein System zyklsich und Azyklisch arbeiten muss, dann lege ich den zyklischen Part auf die CPU und gestalte ihn so als Statemachine, dass ich ihn über die Interrupts steuern kann ohne auch nur einmal einen Thread nutzen zu müssen. Das ist meine Vorstellung vom "Bare Metal" (Klar benötigt man Controller spezifische API Librarys aber das ist trotzdem Bare Metal! Da brauche ich keine Layer 3 Sprache für, Layer 2 reicht vollkommen aus und ist deterministisch im Gegensatz zu Layer 3, wo man nur begrenzt deterministrisch sein kann. (RT auf dem Pi >>typisch<< 270nS war das oder? Auf Bare Metal kann ich es auf den Takt genau ausrechnen wann ich eine Reaktion auf meinem Code zu erwarten habe)
Es ist schlicht eine Frage der Anwendung wie exakt es sein muss, für den einen reicht eine RT Thread Library aus, für mich oder Klebwax Anwendung eben nicht
Rleativierung: Gerade beim Thema DMA muss man aber Vorsichtig sein, das ist teilweise vom Zustand der Peripherie abhängig, ein Atmel-SAMD DMA braucht zwischen ~12 und 27 Takten bevvor ein Byte übertragen wird und manchmal sogar noch länger. Die ERfahrung musste ich auch schonmal machen und deswegen aus einem Projekt verbannen weil ich nur stabil 200kHz sampeln (timestamp + daten, DMA im quasi interleave, echten gibts bei dem nicht) konnte![]()
So hatte ich dann wieder einen XMega eingebaut, weil der bei 32Mhz bis 1Mhz DMA Samplerate und echten interleave unterstützt.
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Lesezeichen