Hallo an Alle,
ich experimentiere mit RTOS für AVM. Das BlinkAnalogRead- Beispiel hab
ich etwas umgeändert und läuft.
Ich möchte einen dritten Task, und später noch mehr, hinzufügen.
Der dritte Task ist analog den zwei anderen aufgebaut. Er macht bisjetzt
nichts, aber beeinflußt die beiden Anderen.
Mein "Blinken" geht ganz schnell und die serielle Schnittstelle sagt
garnichts mehr. Kann der Atmega328 evtl. nur 2 Tasks?
Jeder Task brauch Verwaltungsinformationen und seinen eigenen Stack.
Dafür reservierst du RAM wenn du einen Task erstellst.
1. Irgendwann ist der RAM zu Ende, wenn du zu viele Tasks erstellst.
2. Du must in deinem Task darauf achten, das er nicht mehr verbraucht
als du für ihn reserviert hast.
Bodo M. schrieb:> ich experimentiere mit RTOS für AVM
Du meinst sicher AVR
Welches RTOS nimmst du FreeRTOS?
Bodo M. schrieb:> AVM
AVM ist Hersteller z.B. der FRITZ!Box, was hat das mit Atmega328 zu tun?
Bodo M. schrieb:> ich experimentiere mit RTOS
Welches RTOS?
Bodo M. schrieb:> Kann der Atmega328 evtl. nur 2 Tasks?
Die Hardware hat erstmal gar nichts mit den Tasks zu tun.
Titel deutet auf Arduino hin... wäre auch interessant ob du nun
irgendwas aus der Arduino IDE (Lib) nutzt oder das RTOS unter
AtmelStudio nutzt und dafür aber ein "Arduino" Board verwendest.
Fragen über Fragen.
ck schrieb:> Welches RTOS nimmst du FreeRTOS?
Ja es war FreeRTOS
Adam P. schrieb:> AVM ist Hersteller z.B. der FRITZ!Box, was hat das mit Atmega328 zu tun?
Man kann sich auch mal verschreiben.
Adam P. schrieb:> Titel deutet auf Arduino hin... wäre auch interessant ob du nun> irgendwas aus der Arduino IDE (Lib) nutzt oder das RTOS unter> AtmelStudio nutzt und dafür aber ein "Arduino" Board verwendest.>> Fragen über Fragen.
<Arduino_FreeRTOS.h>
Ich nutze ein UNO Pro Mini (oder so ähnlich) mit 3,3V und 8MHz und
ATMEGA328.
Bis Atmel Studio 4 hab ich noch mitgemacht.
Die Arduino-IDE ist beim programmieren einfacher.
Jonas schrieb:> Der kann sogar nur 1 Task.
Wenn der nur ein Task kann, wozu dann ein RTOS?
Johannes S. schrieb:> wenn sich die Blinkfrequenz geändert hat, dann hat deine neue Task evtl> den Timer verändert den FreeRTOS für seinen Scheduler benötigt.Meine dritte
Task sieht nur so aus:
>Achtung "Arduino Fanboy D."<
void TaskTest(void *pvParameters) // This is a task.
{
(void) pvParameters;
{
}
}
Da ist doch nichts drin, was die Timer verändern kann.
Bodo M. schrieb:> Da ist doch nichts drin, was die Timer verändern kann.
Aber auch nichts anderes.
Eigentlich benötigt jede Task eine Endlosschleife und im besten Fall
auch irgendeine Form der "Kontrollweitergabe"
Bodo M. schrieb:> Da ist doch nichts drin, was die Timer verändern kann.
das ist richtig. Die Task wird gestartet (wenn auch ein xTaskCreate()
dafür ausgeführt wird) und beendet sich gleich wieder.
was passiert mit einer Endlosschleife die nur wartet (evtl. noch eine
andere LED blinken lassen) ?
1
while(1){
2
vTaskDelay(1000/portTICK_PERIOD_MS);// wait for one second
3
}
Ansonsten kann es schon ein Resourcenproblem sein, wenn der Stack für
diese Task auch mit 128 angelegt wird, dann brauchst du schon 3*128 Byte
für den Stack, plus das was dein Programm und Arduino noch so haben
möchte.
Besten Dank.
Eine while Schleife die nix tut, nur wartet.
Meine Tasks gehen alle wieder.
Es blinkt und die Serielle Schnittstelle sagt auch wieder was.
Das in der Task was ausgeführt werden muß, hab ich so nicht gelesen.
Die verbrauchten Ressourcen werden doch am Ende des Compilierprozesses
angezeigt. Oder? Da sind noch 700Byte frei.
Da die ATMEGA wahrscheinlich unter "geht zwar, ist aber sinnlos" laufen,
bin ich jetzt auf der Suche nach einer neuen Entwicklungsumgebung. Die
STM's sind zwar alle recht cool, aber die Prozessoren sind meist für
mich nicht zu Löten oder nicht lieferbar.
Evtl. gibt es auch kleine Module, welche man später auf die Platine
löten kann. Ich suche mal.
da habe ich auch etwas falsches geschrieben, es ist bei FreeRTOS
tatsächlich nicht erlaubt das eine Task ein return in irgendeiner Form
macht. Stattdessen muss man am Ende ein vTaskDelete(NULL); aufrufen
wenn die Task nicht mehr laufen soll. Habe das Buch vom Richard in
Reichweite :) Aber häufiges Task Delete/Create sollte man sowieso
vermeiden, das sind teure Operationen mit Dynamik.
Hier gibt es unter Error auch eine Erklärung für das schnelle Blinken:
https://github.com/feilipu/Arduino_FreeRTOS_Library#errors
Das zeigt einen Heapoverflow an. Die drei Tasks verpackt der Mega328
aber noch, also war das eher das Problem mit dem nicht erlaubten
beenden, was vermutlich ebenfalls in den Errorhandler mit dem Blinken
läuft.
Bei den STM32 kann man gut mit den Nucleo Boards anfangen, dann hast du
gleich die Debughardware mit drauf. Die Nucleos sind billig und gibt es
in verschiedenen Grössen.
Für erste Schritte reicht der AVR sicher, aber wenn Display und
Schnickschnack dazu kommt, dann wird es sehr schnell eng.
Edit:
Doku gibts ja auch als pdf
https://www.freertos.org/fr-content-src/uploads/2018/07/161204_Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide.pdf
Kapitel 3.2 Task Functions
Danke, danke.
Da hab ich ja Lesefutter bis zur nächsten Mondfinternis und noch drei
Monde weiter.
Die Nucleo-Board sind ja ganz praktisch, aber kann man hinterher einen
Prozessor nehmen, der beschaffbar und lötbar ist. Meine Aufbauten sollen
hinterher in eine Platine gegossen werden. Ich werde mal lesen ob das
geht: Mit Nucleo entwickeln und debuggen. Wenn es wie gewünscht läuft,
verwandten Proz. nehmen.
Bodo M. schrieb:> Die verbrauchten Ressourcen werden doch am Ende des Compilierprozesses> angezeigt. Oder? Da sind noch 700Byte frei.
Das ist nur der statisch belegte Speicher. Außerdem belegt praktisch
jedes Programm auch dynamisch zur Laufzeit Speicher, das kann der
Compiler nicht berechnen.
Bodo M. schrieb:> Die STM's sind zwar alle recht cool, aber die Prozessoren sind> meist für mich nicht zu Löten oder nicht lieferbar.
Geht mir genau so.
Die Nucleo-32 Boards haben ein ähnliches Format, wie der Arduino Nano,
zum Beispiel konkret das Nucleo-L031K6 oder das Nucleo-L432KC.
Oder das "STM32 Black Pill STM32F411", ist etwas größer.
Nur bei den Boards mit STM32F103x8 und STM32F103xB musst du aufpassen,
da werden überwiegend schlechte Fälschungen verkauft. Falls du daran
Interesse hast, kann ich dir den Shop von Robotdyn empfehlen. Die
verkaufen Originale und Fälschungen, geben das aber immer eindeutig in
der Artikelbezeichnung an.
Johannes S. schrieb:> Mehr RAM macht bei RTOS mehr Freude, aber für Experimente muss man den> AVR deshalb nicht gleich wegwerfen.
Richtig. Zumal es ja inzwischen etliche mit 16kB RAM onchip gibt...
Allerdings: RTOS ist prinzipiell eigentlich nur was für die Leute, die
µC-Architektur nicht verstehen und versuchen, ihre Kompetenzprobleme auf
ein OS abzuwälzen. Denn: "Quasi-Parallel" macht bei µC das
Interruptsystem...
So kann man das wohl guten Gewissens zusammenfassen.
Ich empfehle xTaskCreateStatic zu verwenden. Da wird nicht zur Laufzeit
mit Malloc der Speicher allokiert, sondern man muss static/globale
Arrays anlegen, und der Funktion übergeben.
Da sieht man schon an der Compilerausgabe wie viel Speicher vom RAM
belegt ist.
c-hater schrieb:> So kann man das wohl guten Gewissens zusammenfassen.
Nein!
Das ist eine sehr einseitige Sichtweise, und damit sicherlich
unvollständig und damit falsch.
Zumindest ist die Komplexität deines Gewissens damit offenbar. Hatte mir
vorher schon gedacht, dass damit irgendwas schief läuft.
Danke für die Bestätigung.
Bodo M. schrieb:> Da die ATMEGA wahrscheinlich unter "geht zwar, ist aber sinnlos" laufen,> bin ich jetzt auf der Suche nach einer neuen Entwicklungsumgebung.
Anstatt den Ressourcen fressenden Brocken FreeRtos zu verwenden,
könntest du auch ein kooperatives, sich an den ProtoThreads(Adam
Dunkels) orientierenden System einsetzen.
Hier hatte ich mal sowas vorgestellt:
Beitrag "Re: Wer benutzt Protothreads?"
Am besten den ganzen Thread lesen....
Wenn man den Rest von 2KB RAM minus Statische minus Heap noch in x
Stackframes für die Threads aufteilen muß, kommt man eh nicht weit. OS
hin oder her.
batman schrieb:> Stackframes für die Threads
Die ProtoThreads und seine Verwandten arbeiten "Stackless".
Es werden keine Stackframes eingerichtet.
Das ist der Vorteil auf kleinen µC.
batman schrieb:> kein RTOS
Natürlich kann ein kooperatives System keine Echtzeit Anforderungen
garantiert erfüllen.
Allerdings ist die harte "Echtzeit" auch gar nicht immer erforderlich.
Wenn sich nur um Nebenläufigkeiten dreht, dann sind die
Protothreads/CoRoutinen schon eine brauchbare Wahl.
Nenne es ruhig "Nicht Fleisch, nicht Fisch" aber es macht dennoch satt.
Arduino Fanboy D. schrieb:> Natürlich kann ein kooperatives System keine Echtzeit Anforderungen> garantiert erfüllen.
Natürlich kann es das. Wenn halt jede kooperativ betriebene Komponente
"hinreichend" kooperativ und fehlerfrei ist.
Der Witz ist: letztlich ist das bei präemptivem MT nicht anders. Der
einzige Vorteil ist, dass ein gestorbener Task nicht gleich das gesamte
System runter reißt.
Die Echzeitbedingung ist aber auch dann NICHT mehr erfüllt. Zumindest
nicht im Bezug auf die Aufgabe dieses gestorbenen Tasks.
Oder anders ausgedrückt: Auch ein präemptives RTOS ist nicht in der
Lage, generell für die gesamte Software die Einhaltung der
Echtzeitbedingung zu garantieren, sondern kann das immer nur maximal für
einen (den fehlerfreien) Teil der Software tun.
Und das gelingt nur unter Inkaufnahme massiver Performance-Verluste.
D.h.: Echtzeit ja (mehr oder weniger), aber halt nur laaangsaaaame
Echtzeit.
Das ist ungefähr, was ein OS ausmacht und warum man die auf µC eher
nicht haben will.
c-hater schrieb:> Das ist ungefähr, was ein OS ausmacht und warum man die auf µC eher> nicht haben will.
tja, ein paar Ausnahmen scheint es ja zu geben wenn man sich die lange
Liste der OS für µC ansieht. Zum Glück teilt nicht jeder deine
Ansichten.
Da hat sich mal jemand Mühe gemacht:
https://www.osrtos.com/
Johannes S. schrieb:> tja, ein paar Ausnahmen scheint es ja zu geben wenn man sich die lange> Liste der OS für µC ansieht.
Das sind zum überwiegenden Teil rein akademische Spielereien. Klar,
einiges wird auch tatsächlich benutzt, aber eben nur von Leuten, die
ihre Software-Qualität nicht in den Griff bekommen.
Da muss es dann halt ein fettes präemptives OS sein, um das Austicken
des unsäglichen absturzgefährdeten Softwaredrecks erkennen und ggf. neu
starten zu können...
Aber wie gesagt: zumindest der abgestürzte Teil war definitiv aus der
Echtzeit. Erkennen und neu starten ist ein SEHR bedenklicher
workaround, keine echte Lösung.
Die richtige Lösung ist: finde und beseitige den Fehler! Hast du alle
gefunden und beseitigt, dann brauchst du auch kein präemptives RTOS
mehr...
Genau!
Und wer gut Auto oder Motorrad fahren kann, braucht auch keinen Gurt und
keinen Helm.
Oder er ignoriert die echte Welt und fährt seit seinem 3. Lebensjahr im
Bobbycar rum.
c-hater schrieb:> Das sind zum überwiegenden Teil rein akademische Spielereien. Klar,> einiges wird auch tatsächlich benutzt, aber eben nur von Leuten, die> ihre Software-Qualität nicht in den Griff bekommen.
Glaubst den Stuss den du schreibst wirklich selbst? Gut, bei dem Nick
kann ich dich sowieso nicht ernst nehmen.
Bodo M. schrieb:> Da die ATMEGA wahrscheinlich unter "geht zwar, ist aber sinnlos" laufen,> bin ich jetzt auf der Suche nach einer neuen Entwicklungsumgebung. Die> STM's sind zwar alle recht cool, aber die Prozessoren sind meist für> mich nicht zu Löten oder nicht lieferbar.
Schau Dir das hier an:
https://www.microchip.com/wwwproducts/en/PIC32MX250F128B
Das kannst Du problemlos löten, und vom Speicher und der Rechenleistung
ist das schon ganz ordentlich. NuttX und FreeRTOS sollten darauf laufen.
fchk
c-hater schrieb:> Die richtige Lösung ist: finde und beseitige den Fehler! Hast du alle> gefunden und beseitigt, dann brauchst du auch kein präemptives RTOS> mehr...
Da muß man sich ja erstmal das Problem zur Lösung produzieren.
Aufwendige Fehlersuche spart man sich gerade durch vernünftige
Rahmen-Konzepte, wozu ggf. auch das passende OS zählt.
batman schrieb:> Aufwendige Fehlersuche spart man sich gerade durch vernünftige> Rahmen-Konzepte, wozu ggf. auch das passende OS zählt.
Alles klar. Genau das ist, was man von RTOS-Usern erwartet. Man spart
die aufwendige Fehlersuche...
Nein, die einzig richtige Lösung ist, die aufwendige Fehlersuche eben
nicht zu sparen.
Na gut, dann such mal schön weiter, wenn du das so toll findest, daß du
Fehler in deinen Programmen versteckst. Manche sollen ja auch
Schokoladeneier im Wald verstecken, also von da her..
batman schrieb:> Na gut, dann such mal schön weiter,
Ach lass ihn doch...
Merksatz:
§1 Der C Hasser hat immer recht
§2 Sollte es einmal so aussehen, als hätte er nicht recht, dann sind
alle anderen Idioten.
Johannes S. schrieb:> c-hater schrieb:>> Das sind zum überwiegenden Teil rein akademische Spielereien. Klar,>> einiges wird auch tatsächlich benutzt, aber eben nur von Leuten, die>> ihre Software-Qualität nicht in den Griff bekommen.>> Glaubst den Stuss den du schreibst wirklich selbst? Gut, bei dem Nick> kann ich dich sowieso nicht ernst nehmen.
c-hater hat ganz offensichtlich sehr viel Erfahrung,aber seine Argumente
sind in vielen Fällen inzw. etwas angegraut (min. 30J abgehangen).
Würde er FreeRTOS kennen käme da nicht so ein Blödsinn.
Und wäre FreeRTOS eine "rein akademische Spielerei" würden sich wohl
kaum so viele (wirklich große) Firmen darauf stürzen.
Der ohnehin schon sehr schlanke Footprint ist bei modernen MCUs ja auch
wirklich kein Thema mehr - auf einem ATTiny macht das natürlich keinen
Sinn.
Harry L. schrieb:> Der ohnehin schon sehr schlanke Footprint ist bei modernen MCUs ja auch> wirklich kein Thema mehr
Laber, laber, sülz.
Der Punkt ist: der Einsatz eines präemptiven RTSO bietet eine gewisse
erhöhte Sicherheit bezüglich einiger Teile der Software, nämlich der
Fehlerfreien.
Tatsächlich benutzt wird es aber üblicherweise, um Bugs nicht fixen zu
müssen, d.h.: es wird konsequent und in großem Umfang mißbraucht.
Das ist alles. Und wer etwas anderes behauptet, kennt die objektive
Realität nicht. So einfach ist das.
c-hater schrieb:> Und wer etwas anderes behauptet, kennt die objektive> Realität nicht. So einfach ist das.
Richtig!
Du hast recht!
(und alle anderen sind blöd)
Moin,
Bitte nicht schießen;-)
Bei den kleinen 8-Bit Dingern kommt es hauptsächlich auf die
"Heimarbeit" an. Zuerst muß man sich im Klaren sein wie die HW
Ressourcen "gleichzeitig" verwendet werden sollen und dokumentiert die
Aufgaben des uC planmäßig.
Dann muß man sich Gedanken machen wer, wann und wo Zugriff auf geteilte
Peripherien haben muß und wie man mit möglichen Ressource Konflikten
umgehen muß um ein zufriedenstellendes Ergebnis zu erhalten. Da der AVR
keine Programmierung der Interrupt Prioritäten zuläßt (beim STM32
besser) muß man sehr aufpassen. Auch helfen Zeitpläne der verschiedenen
nicht synchronen Events und welchen Druck sie auf den Rest ausüben,
einen klare Vorstellung davon zu bekommen wie der uC damit umgehen muß
und wo Konflikte auftreten können und wie man das umschifft.
Das nächste ist, den Programmablauf so zu konzipieren, daß NIEMALS
Blockaden auftreten können. In der Main Loop darf es absolut keine
Warteschleifen geben. Sollte Warten notwendig sein, muß das mit
Zustandsmaschinen und State-Flags implementiert werden. Der Einsatz von
Zustandsmaschinen erlaubt Time-Slice Verteilung der Aufgaben und ISRs
erledigen den Rest. Eine Timer ISR als Master Scheduler hilft die
Zustandsmaschine optimal auszunützen. Serial, SPI, I2C, CAN muss alles
gepuffert sein. Beim Senden darf z.B. das UART nicht den CPU aufhalten.
Das UART muss durch ISR sich die Daten im Puffer selber holen und
abarbeiten. Kommunikationssachen wie UART, I2C, SPI lassen sich alle per
ISR erledigen und fällt meist gar nicht mehr auf.
Für mich hat sich diese Arbeits- und Planungsweise vielfach bewährt und
brauchte noch nie dringend ein RTOS. Planung und Architektur der
Anwendung ist hier ALLES. Viele AVR und PIC, 8051 Projekte liefen auf
diese Weise in Real-Time ohne merkbare Verzögerungen. Blinkende LEDs
(Heartbeat Anzeige) blinken per ISR absolut gleichmäßig. Auch bei
Schrittmotoren merkt man nichts. Man kann z.B. mit dem UART "funken" und
alles andere läuft gleichmäßig. Der Gebrauch von "Delays" sind in
solchen Designs absolut verboten und muß mit Zustandsmaschinen Logik
gesteuert werden.
Wie gesagt, sorgfältige Planung, Dokumentation, Zeit-Diagramme und
bewährte Real-Time Methoden sind essentiell für erfolgreiche Exekution
des Designs.
Wer das alles optimal macht wird überrascht sein was ein 8-Bitter
vermag. Das arme Ding (AVR) läuft immerhin mit bis zu 20 Millionen
Instruktionen per Sekunde. Da sollte sorgfältiges Design schon etwas
nützen.
Ist nur meine Meinung anhand meiner bisherigen Erfahrungen.
Gerhard
c-hater schrieb:> Der Punkt ist: der Einsatz eines präemptiven RTSO bietet eine gewisse> erhöhte Sicherheit bezüglich einiger Teile der Software, nämlich der> Fehlerfreien.
Autsch!
Würdest du FreeRTOS kennen, wüsstest du auch, das Preemption zwar
möglich aber nicht obligatorisch ist.
> Tatsächlich benutzt wird es aber üblicherweise, um Bugs nicht fixen zu> müssen, d.h.: es wird konsequent und in großem Umfang missbraucht.>
Steile These und vollkommener Blödsinn.
In der Realität verlangt so ein System dem Programmierer deutlich mehr
Disziplin ab, als ohne ein RTOS.
Das ist nur ein weiteres Indiz dafür daß du nicht wirklich weist,
worüber du redest.
> Das ist alles. Und wer etwas anderes behauptet, kennt die objektive> Realität nicht. So einfach ist das.
Jaja....du verwechselst offenbar Objektivität mit deiner pers.
antrainierten und scheinbar unumstößlichen Meinung.
"Deine Realität" scheint aber vor 30J stattgefunden zu haben.
Merke: wer nicht mit der Zeit geht, geht mit der Zeit.
c-hater schrieb:> Tatsächlich benutzt wird es aber üblicherweise, um Bugs nicht fixen zu> müssen,
Richtig, weil man weniger programmiert und damit weniger Bugs
produziert, vor allem in oft verwendetem Low-Level-RT-Framework, was
relativ schwer zu debuggen ist. Da verwendet man möglichst schon
getestete und bewährte Fertigbausteine, statt das jedesmal wieder neu
machen zu wollen und dann die Eiersuche darin zu zelebrieren.
batman schrieb:> Richtig, weil man weniger programmiert und damit weniger Bugs> produziert, vor allem in oft verwendetem Low-Level-RT-Framework, was> relativ schwer zu debuggen ist.
... oder andersrum gerechnet: in derselben Zeit kommt man weiter.
Peter S. schrieb:> Weiss jemand ob es so ein kleines RTOS für AVR auch in Assembler> gibt?> Es muss nichts ernstes/kommerielles sein, es geht mir rein um das Hobby.
mir fällt da Femto OS ein
www.femtoos.org (Seite lädt aber bei mir gerade nicht)
Peter S. schrieb:> Weiss jemand ob es so ein kleines RTOS für AVR auch in Assembler gibt?> Es muss nichts ernstes/kommerielles sein, es geht mir rein um das Hobby.
Ehrlich gesagt, wenn schon, dann würde ich sowas nur im kommerziellen
Bereich vermuten. Welcher Bastler - außer Chuck Norris natürlich -
schreibt denn mal rasch ein kleines Betriebssystem für (s)einen
Controller?
Gruß Rainer
Rainer V. schrieb:> Peter S. schrieb:>> Weiss jemand ob es so ein kleines RTOS für AVR auch in Assembler gibt?>> Es muss nichts ernstes/kommerielles sein, es geht mir rein um das Hobby.>> Ehrlich gesagt, wenn schon, dann würde ich sowas nur im kommerziellen> Bereich vermuten. Welcher Bastler - außer Chuck Norris natürlich -> schreibt denn mal rasch ein kleines Betriebssystem für (s)einen> Controller?> Gruß Rainer
c-hater
Und zwar in 5 Minuten.
Rainer V. schrieb:> Peter S. schrieb:>> Weiss jemand ob es so ein kleines RTOS für AVR auch in Assembler gibt?>> Es muss nichts ernstes/kommerielles sein, es geht mir rein um das Hobby.>> Ehrlich gesagt, wenn schon, dann würde ich sowas nur im kommerziellen> Bereich vermuten. Welcher Bastler - außer Chuck Norris natürlich -> schreibt denn mal rasch ein kleines Betriebssystem für (s)einen> Controller?> Gruß Rainer
Ich habe das schon mal gemacht und zwar für die PDP-11 (genauer den
T11). Das war kein ausgewachsenes RTOS mit allen Schnittstellen, aber
man konnte Jobs starten (aber nicht löschen). Es gab Semaphore for
Resourcen (etwa um ein malloc zu machen konnte man die MEM Resource
zuerst beanspruchen), man konnte Prozesse auf Events warten lassen. Das
ganze hatte noch einen Line Time Clock (ja es gab die SLEEP sub-routine,
die legte einen Job für 1..65536 Ticks schlafen). Es war preemptive und
hatte Job Prioritäten.
In der Zwischenzeit habe ich den Source Code wieder ausgegraben und bin
daran das ganze in AVR zu übersetzen als Hobby Projekt. Aber bevor ich
einfach etwas Bestehendes und Altes (es hat über 30 Jahre auf dem
Buckel) transcode hätte es mich interessiert ob es da schon etwas gibt
und vielleicht sind da ja Lösungen oder zusätzliche Features drin die
praktisch wären. Vor allem was moderne Schnittstellen anbelangt.
Der PDP-11 Source Code (ohne Device Treiber oder Interrupt Routinen) war
sehr kompakt, der Core hatte ca. 300 Assembler Instruktionen.
Eigentlich müsste ja so ein RTOS auf einem AVR recht flott
funktionieren, ein T11 Computer war typischerweise auch nur mit
16-32kbyte ROM und wenn es hoch kam mit 16kbyte RAM ausgestattet. Ein
Atmega1284P dürfte da einem T11 um einiges überlegen sein. Auch wenn man
in Betracht zieht, dass der AVR ein 8-bit Prozessor ist und der T11 ein
16-bit. Aber der T11 brauchte für eine Instruktion mindestens 1.6usec.
In der Zeit führt ein AVR 30 Instruktionen aus.
Calling Convention war mit DECUS C kompatibel, d.h. die eigentlichen
Jobs konnte man in Assembler oder C schreiben.
Peter S. schrieb:> Ich habe das schon mal gemacht und zwar für die PDP-11
Und du hast das echt als Bastler/Hobbyist gemacht?? So oder so sollte
dir das nun für die AVR keine Probleme bereiten. Damals war Assembler,
die Struktur war/ist dir klar, heute ist auch Assembler. Wünsche
jedenfalls viel Spass!
Gruß Rainer
Nein der Co
Rainer V. schrieb:> Und du hast das echt als Bastler/Hobbyist gemacht??
Nein der PDP-11 Code war nicht als Bastler sondern als
Echtzeitprogrammierer. Nur ist das jetzt schon eine längere Zeit her
(sie obigen Post) und was damals gut war muss ja nicht unbedingt dem
entsprechen was man heute so machen würde. Seit dieser Zeit programmiere
ich nicht mehr kommerziell. Daher meine Frage nach einem Beispiel.
Damals war Assembler das Mass der Dinge, gerade wenn man Hardwarenah
programmieren musste. Man muss dazu natürlich sagen, dass die
Entwicklungsumgebung für MACRO-11 einiges komfortabler war als man das
heute von frei verfügbaren Assemblern sieht. Es hat richtig Spass
gemacht. Ich bin dann irgendwie bei Assembler hängen geblieben und kann
mich bei Hardwarenaher Programmierung einfach nicht davon lösen. Es ist
halt ein Hobby.
Der Code ist soweit mal übersetzt, die Tests der ersten Funktionen tun
soweit. Als nächstes kommt der Tick Interrupt und die SLEEP Funktion.
Und dann werde ich mal ein BLINKENLIGHTS und ein HELLO WORLD dazunehmen.
Wobei ich dann natürlich mehrere BLINKENLIGTHS gleichzeitig laufen
lassen kann. Und vielleicht sollte ich ein bisschen mehr Kommentar in
den Source Code einfliessen lassen :-)
Peter S. schrieb:> gemacht. Ich bin dann irgendwie bei Assembler hängen geblieben und kann> mich bei Hardwarenaher Programmierung einfach nicht davon lösen. Es ist> halt ein Hobby.
Und warum nimmst Du dann nicht eine bessere Plattform? MIPS-Assembler
ist so übel nun auch nicht, und MIPS gab es auch schon in den 80'ern.
Den gleichen Binärcode, der 1991 auf meiner DECstation 3100 (25 MHz
R2000) lief, kannst Du jetzt auf dem obigen 3.70€ PIC32MX (50 MHz
MIPS4k) laufen lassen.
fchk
Peter S. schrieb:> für die PDP-11
Hmm, ich liebäugele jetzt mit dem umgekehrten Weg, d.h. z.B. FreeRTOS
auf meine PDT-11/150 zu portieren. Damit gäbe es dann endlich mal eine
"sinnvolle Anwendung". Wahrscheinlich gäbe es auch ähnlich viele Nutzer
wie für Josefs bo8. Nächster Schritt: FreeRTOS auf bo8? Nein, das muss
ich mir nicht antun, insbesondere weil es da ja auch keine Interrupts
gibt.
Nun da
Frank K. schrieb:> Und warum nimmst Du dann nicht eine bessere Plattform? MIPS-Assembler> ist so übel nun auch nicht, und MIPS gab es auch schon in den 80'ern.> Den gleichen Binärcode, der 1991 auf meiner DECstation 3100 (25 MHz> R2000) lief, kannst Du jetzt auf dem obigen 3.70€ PIC32MX (50 MHz> MIPS4k) laufen lassen.>> fchk
Man muss unterscheiden zwischen dem Assembler/Instruktionssatz und dem
Assembler der einem zur der Plattform zur Verfügung gestellt wird. Beim
PDP-11 gab es MACRO-11, verschiedenen Preprozessoren und einen Linker
(TKB), man konnte neben den Standard Libraries eigene Libraries
erstellen. Die Macro Sprache hat den Namen wirklich verdient, es war
eine sehr flexible Macro Sprache. Dazu gab es noch viele weitere Tools
und sie waren alle sehr gut dokumentiert.
Ich kenne jetzt den MIPS Assembler nicht, daher kann ich da nichts dazu
sagen. Aber vielleicht kann mir ja mal jemand kurz erzählen was mich da
erwartet, vor allem von den Tools aus. Nur mit "gas" werde ich mich nie
anfreunden können. Für meine Begriffe ist er hässlich.
Was den Instruktionssatz und die Assembler Syntax der AVR Prozessoren
anbelangt kann ich mich nicht beklagen. Er gehört zu den schönsten den
ich von Microprozessoren kenne, schade ist nur, dass avrasm2 ein
stand-alone assembler ist der direkt binären Code produziert und man
nicht module linken kann.
Wichtig ist für meine Hobby Projekte, dass die IO pins der
Microcontroller 5V TTL kompatibel sind, da ich meistens Erweiterungen
für meinen PDP-11 bastle und ich will mich (noch) nicht mit Pegelwandler
herumschlagen. Mir reicht schon dass Gefummel mit den notwendigen Bus
Treiber. Ich war zwar kurz davor diesen Weg zu gehen , aber dann hat
Microchip die AVR128 Familie vorgestellt. Die hat eigentlich alles was
ich brauche.
Der Preis der einzelnen MCU spielt dabei keine Rolle, mit dem Schweizer
Einzelstückpreiszuschlag ist jede MCU teuer.
Peter S. schrieb:> Wichtig ist für meine Hobby Projekte, dass die IO pins der> Microcontroller 5V TTL kompatibel sind, da ich meistens Erweiterungen> für meinen PDP-11 bastle und ich will mich (noch) nicht mit Pegelwandler> herumschlagen.
Dann wären die dsPIC33EV256GM1xx mit 70 MHz was für Dich.
https://www.microchip.com/wwwproducts/en/dsPIC33EV256GM102
fchk
Frank K. schrieb:> Dann wären die dsPIC33EV256GM1xx mit 70 MHz was für Dich.
Danke für den Tip, das muss ich mir anschauen, vor allem DMA wäre noch
auf meiner Wunschliste gewesen. Und 16-bit Architektur macht auch vieles
einfacher. SMD ist kein Problem, und ein Pickit 3 liegt auch noch rum.
P.S. Blinkenlights und Hello World mit timer funktionieren jetzt :-) und
parallel dazu eine interaktive Anwendung. Multi-Tasking ist doch ganz
nett. Jetzt kommt der erste Device Treiber für den UART dran.
Peter S. schrieb:> Andreas S. schrieb:>> FreeRTOS>> auf meine PDT-11/150>> Und warum nimmst du nicht RSX-11S? Oder RT-11
Das gibt es doch schon. Und für echte neue Applikationen würde ich
heutzutage eher keine PDP/PDT-11 einsetzen. Dann schon eher eine VAX.
Aber FreeRTOS auf einer PDT-11 wäre so unfassbar sinnbefreit, dass es
schon wieder Spaß bereiten könnte. Vielleicht reicht dann ja der
Speicher, um in einem Task eine Laufzeitumgebung für Befunge, Brainfuck
oder Whitespace laufen zu lassen.
Andreas S. schrieb:> Aber FreeRTOS auf einer PDT-11 wäre so unfassbar sinnbefreit, dass es> schon wieder Spaß bereiten könnte.
Ja, krieg' dich wieder ein... die Frage ist und bleibt doch "was heißt"
Echtzeit!! Und man muß definitiv immer wissen, was man tut! Sonst ist es
piepegal, womit du programmierst. Eine lächerliche Weisheit, ich weiß,
aber eine immer noch gültige :-)
Gruß Rainer
Stefan ⛄ F. schrieb:> Der ESP32 läuft unter Arduino bereits mit RTOS.
Ich wage jetzt noch mal die zweifelnde Bemerkung, dass man wissen muß,
was man tut! Nur weil man sich RTOS draufschafft, ist man noch lange
nicht "Echtzeit", glaubt mir...
Gruß Rainer
Rainer V. schrieb:> Nur weil man sich RTOS draufschafft, ist man noch lange> nicht "Echtzeit"
Bodo hat nicht danach gefragt und ich habe es nicht erwähnt.
Also was soll der Quatsch?
Rainer V. schrieb:> Nur weil man sich RTOS draufschafft, ist man noch lange nicht> "Echtzeit", glaubt mir...> Gruß Rainer
Glaube ich nicht, mit RTOS wird alles einfacher und läuft schneller!
Reicht das als Vorlage?
Peter S. schrieb:> Frank K. schrieb:>>> Dann wären die dsPIC33EV256GM1xx mit 70 MHz was für Dich.>> Danke für den Tip, das muss ich mir anschauen, vor allem DMA wäre noch> auf meiner Wunschliste gewesen. Und 16-bit Architektur macht auch vieles> einfacher.
Arm Cortex M (Thumbs2) mit 32 Bit, gegebenenfalls mehreren 100Mhz, DMA,
auf Wunsch MMU und unmengen an Peripherie?
Gerhard O. schrieb:> Der Gebrauch von "Delays" sind in> solchen Designs absolut verboten und muß mit Zustandsmaschinen Logik> gesteuert werden.
Das ergibt sich ja von selbst. Selber nehme ich einfach einen TimeTicker
per int und leite daraus diverse Zeitscheiben ab (mit modulo oder
bitcheck). Am Ende check ich die verbleibende Zykluszeit (wie bei einer
einer SPS). Dazu läuft der Watchdog und ein Prozesszähler ( wenn eins
davon nicht stimmt -> Fehler).
Semaphore lokale und nichtlokale Vars Strings etc handle ich über units
und .h files. Max. gibt es einen Callback in eine andere unit.
Das ist dann alle native C und trotzdem schön getrennt. Der Overhaead
ist nahe null da sich das "RTOS" aus der Struktur ergibt.
Mein mini RTOS steht. Mindestens als Experiment wie es eigentlich Bodo
ursprünglich wollte. Mit mini meine ich, ich habe nur das absolute
Minimum an Funktionen eingebaut die ich für nötig halte.
acquire: dient dazu um einen lock/resource zu bekommen
release: dient dazu um einen lock/resource frei zu geben
block: dient dazu um auf einen Event zu warten (aka Interrupt)
unblock: dient dazu einen Event zu signalisieren
create: dient dazu einen Job zu starten
_sleep: (sleep ist als instruction schon vergeben) legt einen Job eine
gewisse Anzahl (1..32678) ticks schlafen
setpriority: setzt die priorität des aktuellen job
Jeder Job braucht einen Job Control Block und einen Stack
Vorbereitet ist eine Interrupt Dispatching genannte Funktion die es
einem Interrupt erlaubt auf einem zentralen Kernel Stack weiter zu
machen, damit nicht jeder Job Stack mehr Reserve haben muss als für eine
minimale Interrupt Routine nötig ist. Kann man benutzen muss man nicht.
Wie gesagt es ist (und bleibt womöglich auch) ein Experiment und hat
einfach nur Spass gemacht. Mehr nicht. Und es enthält sicher noch
Fehler. Ob ein RTOS sinnvoll ist oder nicht muss jeder selbst
entscheiden und hängt sicher von der jeweiligen Anwendung ab. Es gibt ja
nicht immer nur die Lösung.
wer RTOS verwenden will mit mehreren Tasks, der muss bereit sein, sich
an RTOS anzupassen. Wer versucht, seine gewohnte Arbeitsweise RTOS
überzustülpen wird die Vorteile von RTOS nicht kennenlernen.
RTOS braucht selbst Ressourcen, also wird nichts durch RTOS schneller,
außer vielleicht die Codeerstellung weil jemand anders schon Vorarbeit
geleistet hat für das RTOS.
RTOS partitioniert die verfügbare Rechenleistung und man kann sie
leichter verteilen (Priorisierung von Tasks und osDelay() für
Wartepausen wenn eine geringe Reaktionszeit für den Task machbar ist).
Die am Schwersten zu schluckende Pille ist, keine Annahme mehr zu machen
wie lange die Ausführung von einem Codeblock dauert, da der scheduler
reingrätschen kann. Einzig wann die Ausführung eines Codeblocks startet
kann man steuern.
Schlechte Programmierer machen mit RTOS keinen besseren Code und gute
Programmierer schreiben schneller guten Code mit RTOS.
Ein AVR wird von freeRTOS unterstützt, also kann der TO getrost seinen
AVR für die ersten Gehversuche mit RTOS benutzen. Ist er ein guter
Programmierer und lernt er was dazu wird er zum besseren Programmierer.
Wenn er noch Spaß dabei hatte kann es kaum noch besser werden.
Rainer V. schrieb:> Ja, krieg' dich wieder ein... die Frage ist und bleibt doch "was heißt"> Echtzeit!!
Ich habe nicht geschrieben, dass ich irgendeine Anwendung mit
Echtzeitanforderungen betreiben will, sondern damit liebäugele, FreeRTOS
zu portieren.
Außerdem ist der Begriff "Echtzeit" in Bezug auf das Ablaufverhalten von
Software bzw. Steuerungen recht genau definiert.
> Und man muß definitiv immer wissen, was man tut! Sonst ist es> piepegal, womit du programmierst. Eine lächerliche Weisheit, ich weiß,> aber eine immer noch gültige :-)
Ach wirklich? Das ist mir im Laufe der letzten Jahrzehnte noch nie
aufgefallen. Was sollen hier also solche hohlen Phrasen.
"Echtzeit" definiert nur das ein bestimmtes Zeitverhalten, das vorher
definiert wurde in der Implementation in einer zu definierenden
Zuverlässigkeit erfüllt wird.
https://de.wikipedia.org/wiki/Echtzeit
Wenn ich für mein System definiere das die Reaktion auf einen IRQ
innerhalb von 2 Wochen erfolgt, dann ist mein System ein "harte
Echtzeit" System, wenn 100% der IRQs innerhalb der vorgegebenen Zeit
abgearbeitet werden.
Die ms, us und ns Erbsenzähler keinen also die Definition von "harte
Echtzeit" nicht. Die Anforderung an das System definiert "RTOS", nicht
eine fixe Zahl.
BTW, freeRTOS ist nicht safe, da es dynamische Speicherverwaltung
enthält, die in einem "harten Echtzeit" System nicht verwendet werden
dürfen da eine 100%ige Vorhersage des Zeitverhaltens dadurch nicht
möglich ist.
Hi,
keine Ahnung ob es hier hilft, aber für die atmels habe ich vor Jahren
mal ein OS entwickelt, das ein paar features hat:
-Multitasking preemptiv/kooperativ
-dynamische taskverwaltung
-Speicherverwaltung basierend auf arrays
-soft echtzeitfähig
-binäre semaphore
-messaging system
http://sourceforge.net/projects/nanoos/
Es gab hier auch mal einen thread dazu
Beitrag "NeuesOS für AVR Mikrocontroller"
Rainer V. schrieb:> Ehrlich gesagt, wenn schon, dann würde ich sowas nur im kommerziellen> Bereich vermuten. Welcher Bastler - außer Chuck Norris natürlich -> schreibt denn mal rasch ein kleines Betriebssystem für (s)einen> Controller?
Für einen AVR8 (oder andere kleine µC ähnlicher Komplexität) ist das
relativ schnell machbar. Wird halt nur auf den meisten Vertretern dieser
Art wenig Spaß machen, weil sehr viel von den knappen Resourcen nur
dafür verwendet werden muss, ein OS laufen zu lassen, welches sie
verwaltet.
Spannend wir ein RTOS erst mit mehreren Kernen und/oder komplexer
Peripherie (die praktisch selber auch wieder ein Controller mit einiger
Komplexität ist).
Klaus W. schrieb:> c-hater
Jepp, das könnte ich sicher. Und wenn ich es im AVR8-Umfeld für sinnvoll
halten würde, hätte ich es genauso sicher auch schon vor vielen Jahren
getan.
Aber ich bin damals(tm) recht schnell zu dem Schluß gekommen: ist am
ende hochineffizienter Schwachsinn.
> Und zwar in 5 Minuten.
Naja, ich habe da schon ein wenig länger drüber nachgedacht und eine
Umsetzung hätte sicherlich noch deutlich länger gedauert.
Aber eins ist 100%ig sicher: In Assembler wäre die Umsetzung deutlich
einfacher als in C...
Man muss sich doch nur den RTOS-code anschauen, um zu erkennen, dass da
an vielen Stellen an C vorbeilaviert werden muss, also letztlich alles
wirklich Wichtige in Asm programmiert ist. Vom Task-Switching über die
Sync-Objekte, immer ist der wesentliche Knackpunkt in Asm geschrieben.
Der Witz ist: das ist auf JEDER anderen Architektur genauso!
Asm rules!
c-hater schrieb:> Asm rules!
Genau :-)
Am schönsten wäre es wenn das ganze in Kombination möglich wäre. Mit dem
AVRASM2 zusammen ist das leider nicht der Fall.
Ich habe mir auch schon überlegt in meiner minimal Version die Calling
convention von C zu berücksichtigen aber dann stehe ich vor dem Problem
wie kombiniere ich das? Hat jemand eine Idee wie man das hinbiegen
könnte? Auf der PDP-11 war das so einfach, dass ich mir nie viel
Gedanken darüber machen musste wie man Module die in verschiedenen
Sprachen geschrieben wurden zusammenfügt.
Peter S. schrieb:> Am schönsten wäre es wenn das ganze in Kombination möglich wäre. Mit dem> AVRASM2 zusammen ist das leider nicht der Fall.
Wennschon, dann macht man sowas auch mit dem eingebauten Assembler des
Compilers. So vollkommen Scheiße und abstrus häßlich der auch sein
mag...
Das ist doch jetzt alles ziemliches Geschwurbel. Wer hat denn
tatsächlich - ganz ehrlich - ein hartes "Echtzeit-System" programmieren
müssen? Der Bastler im Leben nicht ( wie Heinz Becker sagen würde) und
der Firmware-Spezi in seltensten Fällen. Hat sich hier auch noch keiner
zu Wort gemeldet....außer "hätt, wenn und würde..." Also sage ich,
schön, dass wir drüber gesprochen haben :-)
Gruß Rainer
Rainer V. schrieb:> Das ist doch jetzt alles ziemliches Geschwurbel. Wer hat denn> tatsächlich - ganz ehrlich - ein hartes "Echtzeit-System" programmieren> müssen?
Sehr, sehr viele µC-Anwendungen SIND harte Echtzeit. Nur halt ohne ein
"System" (=RTOS) drumrum...
Halt mit dem umgesetzt, was die Hardware bietet. Bei den weniger Fähigen
ist halt der letzte Ausweg der Watchdog-Reset. Spielt de facto effektiv
ziemlich genau die Rolle eines RTOS...
Verstecke die Bugs, erspare es mir, sie zu suchen und zu beseitigen...
c-hater schrieb:> Sehr, sehr viele µC-Anwendungen SIND harte Echtzeit. Nur halt ohne ein> "System" (=RTOS) drumrum...
Ja Mann, auch die blinkende LED ist so gesehen eine harte
Echtzeitanwendung! Ansonsten...Geschwurbel...
Rainer V. schrieb:> Ja Mann, auch die blinkende LED ist so gesehen eine harte> Echtzeitanwendung!
Ganz genau. Zumindest sobald sie von irgendwelchen äußeren Einflüssen
gesteuert wird und innerhalb einer exakt definierbaren Maximalzeit mit
einem exakt definierten Verhalten diesem Input zu folgen vermag.
> Ansonsten...Geschwurbel...
Du hältst den eigentlichen Kern der "Echtzeit" für Geschwurbel? Dann
bist du definitiv ein Vollidiot.
c-hater schrieb:> Sehr, sehr viele µC-Anwendungen SIND harte Echtzeit. Nur halt ohne ein> "System" (=RTOS) drumrum...
Da muß ich c-hater ausnahmsweise mal zustimmen.
Ein populäres beispiel ist z.B. die HDD-Clock:
https://www.youtube.com/watch?v=XK9en2H7rBA&ab_channel=mb1988mb1988
"Echtzeit-Fehler" würde man sofort sehen....
Jede gemultiplexte Anzeige ist "harte Echtzeit" - sonst würde das
flackern.
Allerdings kann man das -zumindest im Fall von FreeRTOS- auch mit dem
RTOS erreichen.
das Eine schließt das Andere nicht aus.
c-hater schrieb:> Wennschon, dann macht man sowas auch mit dem eingebauten Assembler des> Compilers. So vollkommen Scheiße und abstrus häßlich der auch sein> mag...
Dann lass ich das lieber bleiben, da ist es für meine Basteleien
angenehmer ich bleibe bei 100% avrasm2.
Bodo M. schrieb:> ich experimentiere mit RTOS für AVM. Das BlinkAnalogRead- Beispiel hab> ich etwas umgeändert und läuft.> Mein "Blinken" geht ganz schnell und die serielle Schnittstelle sagt> garnichts mehr. Kann der Atmega328 evtl. nur 2 Tasks?
man kann sich das Leben auch schwer machen.
Ich mache das nicht mit RTOS noch Tasks, ich schreibe alles was ich auf
dem LCD sehen will, Uhrzeit, Feuchtewerte, Temperaturen, Statusmeldungen
für meine Rolläden oben/unten zu jeder Zeit wo sich was ändert in ein
char Array dem LCD angepasst 14 Zeichen mit 0 also 15 char/Zeile x 6
Zeilen für das Nokia5110 ins RAM und per Timer IRQ 10ms in der
Tastenentprellroutine habe ich Counter z.b. 25 für LCD Update oder
andere und immer wenn ein Counter abgelaufen ist if(!lcd_count) , z.B.
LCD update wird in der loop zum LCD Update gesprungen und aufs LCD
geschrieben und der Counter danach wieder auf 25 gesetzt. In der 10ms
Timer IRQ wird der decrementiert if(lcd_count) lcd_count--;
klar 4x pro Sekunde ist noch gut lesbar und die Uhrzeit läuft
geschmeidig.
Für ADC Werte könnte man auch 10 LCD prints / Sekunde machen, mehr ist
eh nicht lesbar.
Nun muss man "nur" noch feststellen wielange so eine "Task" benötigt,
ich setze am Begin einen Port und am Ende setze ich den zurück,
dazwischen schaue ich mit dem Oszi die Zeitdauer ob es reinpasst.
Am AVR kann ich sogar in der IRQ eine I2C Tastaturabfrage machen, dauert
1,5µs und passt locker in die 10ms Timer IRQ.
Ich kann sogar mit IRMP 15000Hz Abfragen machen vorgeschaltet bis 150
zählen für 10ms und dann weiterverarbeiten.
Damit läuft IRMP und 10ms Timer zusammen.
Es kann natürlich sein das die beiden mal kollidieren, aber da IR
sowieso mehrfach senden ist mir da noch nie eine Fehlfunktion
aufgefallen.
Eine ADC Wandlung die schneller ist z.B. 34µs und einen schnell ändernen
Wert liefert kann man eh nicht ablesen, man kann Mittelwerte bilden und
diese anzeigen, oder man zeigt Maxima und Minima.
Joachim B. schrieb:> man kann sich das Leben auch schwer machen.
Aber wenn man mit nem RTOS spielen möchte ist das doch ein guter Ansatz.
Ist zwar etwas sinnlos auf der kleinen Platform, aber zum spilen reicht
es.
Wenn man mit 20 Leuten im Team einen Satelliten baut ist ein RTOS eine
große Hilfe. Aber selber hab ich das irgendwann sein gelassen. Das
addiert jede Menge Komplexität zu einer Anwendung, Das war bei meinen
nie gerechtfertigt.
Langsamer wird das ganze auch und irgendwann auch teuer.
Nei Mehrkernern kann ich mir aber vorstellen das einzusetzen. Kann
FreeRTOS das eigentlich?
Mucky F. schrieb:> Nei Mehrkernern kann ich mir aber vorstellen das einzusetzen. Kann> FreeRTOS das eigentlich?
angeblich beim ESP32 2 Kerner, aber das Zusammenspiel wird etwas
komplizierter, soweit bin ich noch nicht.
Hurra, jetzt habe ich dank dem Experiment mit meiner RTOS Version
endlich einen blöden Bug in einem debugging Modul von mir gefunden. Ich
hatte ja schon länger den Verdacht, dass ich da irgendwas verbockt habe
aber gefunden habe ich es nicht. Es hat sich also so oder so gelohnt :-)
Gerhard O. schrieb:> Da der AVR> keine Programmierung der Interrupt Prioritäten zuläßt
Diese Lüge (oder Ausdruck maximaler Unwissenheit) habe ich jetzt erst
gesehen. Nein, natürlich kann man auch beim AVR8 Interrupt-Prioritäten
festlegen. Bei den XMega und ihren aktuellen Nachfolgern sogar in
Hardware. Bei den "klassischen" immerhin mittels Software.
Selbst letzteres hat noch einen sehr viel geringeren Footprint als ein
Software-Monster á la FreeRTOS.
c-hater schrieb:> Diese Lüge (oder Ausdruck maximaler Unwissenheit) habe ich jetzt erst> gesehen.gähn
Was soll das? Es war vorher schon klar was Gerhard gemeint hat. Das was
du geschrieben hast, per HW ist die Priorisierung nicht vorhersehen aber
mittels SW kann man da schon etwas machen.
Ach so, dir war das nicht klar.
Und was hat FreeRTOS mit Interruptprioritäten zu tun?
Der c-hater weiß ganz genau, dass die Xmega und Tiny 0 Serien unter
Hobbybastlern selten verwendet werden. Wenn hier jemand AVR ohne
weiteren Zusatz schreibt, darf er genau wie alle anderen von den
klassischen ATmega ausgehen. Der ATmega328A ist der bekannteste
Vertreter dieser Serie und somit das Maß der Dinge.
Ja Prioritäten für Interrupts auf AVR ist möglich, aber es ist ein
riesen Handstand. Besonders mühsam ist, dass der Prozessor Status nicht
automatisch auf dem Stack landet. Wenn man jetzt Funktionen hat die von
verschiedenen Prioritäten benutzt werden, dann muss man irgend wie immer
von Hand ablegen was gemeint ist. Das ist definitiv nicht das was ich
unter verschiedenen Prioritäten verstehe. Eine PDP-11 hat das wesentlich
eleganter gelöst.
Und auch bei den zwei Interrupt Ebenen die einige AVR MCUs beherrschen
ist das nicht wirklich besser.
Stefan ⛄ F. schrieb:> Der c-hater weiß ganz genau, dass die Xmega und Tiny 0 Serien unter> Hobbybastlern selten verwendet werden.
Das weiss ich tatsächlich, ist aber irrelevant bezüglich einer
Tatsachenbehauptung über eine Architektur.
Also Tipp speziell für dich noch: es gibt außer den Tiny-0-Series
inzwischen auch noch viel mächtigeres AVR8-Gerät als XMega-Erben.
Tiny-1-Series, Mega-0-Series und (last but not least) AVRxDy.
> klassischen ATmega ausgehen.
Nunja und für die kann man halt problemlos eine Interruptpriorisierung
in Software umsetzen. (Was bei den XMega und -Erben nicht geht, aber die
können es halt in Hardware).
Man muss halt einfach nur wissen, was man tut. Das ist alles. Du weißt
nicht, wie's geht und der Gerhard O. weiss es wohl auch nicht. Ich
schon.
> Der ATmega328A ist der bekannteste> Vertreter dieser Serie und somit das Maß der Dinge.
Na das wäre ja das Allerletzte. Man läßt sich von den Hobbyisten den
Rahmen für die objektive Wahrheit vorschreiben. Du spinnst doch!
c-hater schrieb:> Man läßt sich von den Hobbyisten den> Rahmen für die objektive Wahrheit vorschreiben. Du spinnst doch!c-hater schrieb:> In Assembler: kein Problem.
Alles klar, die Profis vertrauen dem Mann, der nicht anderes als
Assembler akzeptiert. Muahaha!
Stefan ⛄ F. schrieb:> Alles klar, die Profis vertrauen dem Mann, der nicht anderes als> Assembler akzeptiert. Muahaha!
Ich kann das natürlich auch in C umsetzen. Aber das mache ich nur für
Geld, nicht freiwillig und als Hobby. Bin ja nicht pervers.
c-hater schrieb:> Bin ja nicht pervers.
Hoffentlich nicht. Sicher ist allerdings, dass du der verirrte
Geisterfahrer bist, der allen anderen zuruft "ey, du fährst falsch
herum!".
Stefan ⛄ F. schrieb:> Hoffentlich nicht. Sicher ist allerdings, dass du der verirrte> Geisterfahrer bist, der allen anderen zuruft "ey, du fährst falsch> herum!".
Für jemanden, dessen Horizont so ungefähr das Arduino-Unversum umfasst
(und nichtmal dies wirklich), hast du eine ganz schön große Klappe.
Stefan ⛄ F. schrieb:> Alles klar, die Profis vertrauen dem Mann, der nicht anderes als> Assembler akzeptiert. Muahaha!
Ehrlich gesagt, kann ich mich mit systemnahem Code in C mit inline
Assembler nicht anfreunden. Es ist an Unübersichtlichkeit kaum zu
überbieten.
Wenn ich mir die Source von Real-Time OS in C anschaue, dann kräuseln
sich bei mir die Zehennägel. Das hat mit C nicht mehr viel am Hut.
Peter S. schrieb:> Ehrlich gesagt, kann ich mich mit systemnahem Code in C mit inline> Assembler nicht anfreunden. Es ist an Unübersichtlichkeit kaum zu> überbieten.
Assembler Code hat den Charme, dass du bis auf Bit und Takt genau weißt,
was sie tun. Je weiter man sich davon entfernt, umso mehr artet das
Programmieren in Richtung eines Adventure Games aus, wo man herausfinden
muss, was eigentlich los ist und was man machen soll.
Deswegen hat Assembler durchaus seine Daseinsberechtigung - nur nicht
als einzig wahre Überall-Lösung, wie der c-hater es darstellt.
Stefan ⛄ F. schrieb:> Deswegen hat Assembler durchaus seine Daseinsberechtigung - nur nicht> als einzig wahre Überall-Lösung, wie der c-hater es darstellt.
Ja und darum bin ich immer noch auf der Suche wie ich richtigen
Assembler mit C auf AVR kombinieren könnte. Ohne Erfolg bis jetzt.
Peter S. schrieb:> Ja und darum bin ich immer noch auf der Suche wie ich richtigen> Assembler mit C auf AVR kombinieren könnte. Ohne Erfolg bis jetzt.
Das ist doch gut dokumentiert, wie man das anstellt und funktioniert
perfekt.
Die AVR Gcc Toolchain beinhaltet u.A Assembler Compiler und Linker.
Diese spielen auch gut miteinander.
https://gcc.gnu.org/wiki/avr-gcc
Vielleicht wenn ich mal zu viel Zeit habe um alle meine Sources und
Macros anzupassen. Aber bis dann warten ich noch ab. Das ABI war mir
schon bekannt. Das ist ja auch nicht mein Problem.
c-hater schrieb:> In Assembler: kein Problem.
Das mit dem kein Problem würde ich gerne etwas näher betrachten. Was ist
dein Ansatz? Ich sehe das so, dass jede OS Funktion zwei Eingänge haben
muss, einen für normale jobs/task und einer für Interrupts, dann wäre es
in der Tat nicht so kompliziert.
Er meint das vermutlich so, dass alle anderen Programmiersprachen
irgendwo Einschränkungen haben. Nur Assembler unterstützt garantiert den
vollen Funktionsumfang des Prozessors. Deswegen ist es leicht, jede
Frage mit "In Assembler geht das" zu beantworten.
Peter S. schrieb:> Das mit dem kein Problem würde ich gerne etwas näher betrachten. Was ist> dein Ansatz? Ich sehe das so, dass jede OS Funktion zwei Eingänge haben> muss, einen für normale jobs/task und einer für Interrupts, dann wäre es> in der Tat nicht so kompliziert.
Nicht ganz. Es ist NOCH einfacher. Man kann nämlich jede ISR in zwei
Teile zerlegen. Einen, der exclusiv (also nicht unterbrechbar)
ausgeführt wird und einen, der einfach nur noch "Task mit höchster
Priorität" ist. Das ist billig.
Der eigentliche Aufwand ist (um dies auf ein RTOS abzubilden), dass an
der Grenze dieser zwei "natürlichen" Phasen einer ISR ein Taskswitch
ausgeführt werden muss.
Das macht die Sache so elend ineffizient. Taskswitch ist auf AVR8 extrem
teuer. Der hat nur einen Satz Register und nicht eins davon wird
automatisch gesichert, wenn ein Interrupt passiert. Das betrifft
gleichermaßen MCU-Register als auch für die MCU relevante SFIOR, also
insbesondere natürlich SP und das Flag-Register (bei den größeren noch
ein paar mehr).
Die beste Lösung, ein RTOS auf einem AVR8 unzusetzen ist also: Eben
KEIN RTOS umzusetzen (jedenfalls keins im üblichen akademischen
Sinne).
Stefan ⛄ F. schrieb:> Er meint das vermutlich so, dass alle anderen Programmiersprachen> irgendwo Einschränkungen haben. Nur Assembler unterstützt garantiert den> vollen Funktionsumfang des Prozessors. Deswegen ist es leicht, jede> Frage mit "In Assembler geht das" zu beantworten.
Stimmt. So kann man das auch ausdrücken.
> Er meint das vermutlich so, dass alle anderen Programmiersprachen> irgendwo Einschränkungen haben. Nur Assembler unterstützt garantiert den> vollen Funktionsumfang des Prozessors.
Und wenn man noch präziser sein wollte, müsste man sagen: Binärcode.
Denn neben dem im Assembler offiziellen Befehlen gibt es auch noch
inoffizielle Hidden-Codes.
Solche Segmente koennte man ja in Assembler, binaer, inline oder extern
zum C schreiben, mit der entsprechenden Latte ifdefs fuer jede
Prozessorvariante. Wird aber selten von Noeten sein. Jedenfalls kein
Grund, generell nicht in C/C++ zu schreiben.
c-hater schrieb:> Nicht ganz. Es ist NOCH einfacher. Man kann nämlich jede ISR in zwei> Teile zerlegen. Einen, der exclusiv (also nicht unterbrechbar)> ausgeführt wird und einen, der einfach nur noch "Task mit höchster> Priorität" ist. Das ist billig.
Das sind dann aber weniger hierarchische Interrupts als vielmehr ein
einfacher Fork.
Moby schrieb im Beitrag #6727194:
> Wozu? Das steigert erstens die Komplexität unnötig und verbraucht> zweitens selber Ressourcen. Nutze wie von Gerhard und c-hater> beschrieben das viel effizientere Interrupt-System, denn dafür ist es> da!
Warum sollte die Komplexität steigern, nur weil ich klar voneinander
getrennte Jobs habe nimmt die Komplexität sicher nicht zu. Und wieviel
Resourcen ein solches RTOS verbracht hängt davon wie es implementiert
ist. Ohne RTOS muss ich die verschiedenen Aufgaben auch verwalten. Mein
Beispiel braucht weniger als 100 Befehle für einen vollständigen
Kontextswitch. Das bearbeiten von Ticks ist auch nicht aufwändiger als
mit einem selbstgestrickten Scheduler. Resourcen können reserviert
werden ohne Interrupts über längere Zeit auszusperren. Es ist im
Gegenteil sehr übersichtlich wenn das CLI oder der Kommunikationsprozess
ein eigener Job ist und er gesteuert von externen Events seine Aufgaben
macht und mit Hilfe der Prioritäten muss man bei unwichtigen Jobs nicht
immer dafür sorgen, dass sie selbst oder extern gesteuert ihre Aufgabe
aufteilen müssen. Es ist sicher nicht die einzige Lösung aber in meinem
Fall passt es perfekt. Die Performance aktueller AVR Prozessoren reicht
locker, da kann ich das bisschen CPU Overhead gut verkraften, dass ich
für jeden Job einen eigenen Stack brauche ist kaum der Rede Wert, ich
brauche für meine Aufgabe etwa 8kbyte RAM, die AVR128 haben 16kbyte, das
reicht locker für die 9 Jobs die ich plane. Und die Interrupts, auch in
den 2 prioritäten, stehen mir immer noch zur Verfügung.
Und das Wichtigste, es hat Spass gemacht. Eigentlich wollte ich schon
immer einen kleinen Kernel bauen. Dank diesem Thread habe ich den alten
PDP-11 Source hervorgekramt und den Core nach AVR übersetzt. und siehe
da es war erstaunlich einfach.
Moby schrieb im Beitrag #6727191:
> Absolut. Die wichtigste Triebkraft für höherbittige ist ganz allgemein> schlechtere Software-Qualität...
Das sehe ich anders. Die Anzahl der Bits hat nichts mit Qualität zu tun.
Man hat auch nicht die 8-Zylinder Motoren erfunden, weil Motoren mit
4-Zylindern schlechte Qualität haben.
Stefan ⛄ F. schrieb:> Man hat auch nicht die 8-Zylinder Motoren erfunden, weil Motoren mit> 4-Zylindern schlechte Qualität haben.
aber man hat 16-Zylindermotoren gebaut weil man 1500PS Leistung noch
nicht aus 4-Zylinder bekommt.
vielleicht irgendwann
A45 AMG
Modell: Mercedes-Benz A-Klasse
UVP: Ab 49.313,6€
Motorleistung: 306 bis 387 PS
Beschleunigung 0-100 km/h: 4 bis 4,8 Sekunden
Motorisierung: 2,0 l 4-Zylinder
https://www.youtube.com/watch?v=d241BY0J1SI
Joachim B. schrieb:> aber man hat 16-Zylindermotoren gebaut weil man 1500PS Leistung noch> nicht aus 4-Zylinder bekommt.> vielleicht irgendwann
Schau dir Schiffsdiesel an, die kriegen 1500PS aus 4 Zylindern hin ;-)
Joachim B. schrieb:> weil man 1500PS Leistung noch> nicht aus 4-Zylinder bekommt.
...kommt wohl schlicht auf den Zylinder an...unglaublich dick und
sagenhaft lang...
Falk B. schrieb:> Schau dir Schiffsdiesel an, die kriegen 1500PS aus 4 Zylindern hin ;-)
Och, die augenblickliche Grenze liegt bei ca 7 Tausend Kilowatt pro
Zylinder und davon gibts dann bis zu 14 in einer Reihe.
Da ist man dann bei ca 1/8 Million PS an der Welle.
Peter S. schrieb:> Mein Beispiel braucht weniger als 100 Befehle für einen vollständigen> Kontextswitch
Die Frage ist ja wie oft der Kontext gewechselt wird. Bei einer
seriellen mit 115k ist das schnell an der Grenze.
Mucky F. schrieb:> Die Frage ist ja wie oft der Kontext gewechselt wird. Bei einer> seriellen mit 115k ist das schnell an der Grenze.
Darum gibt es bei mir auch einen UART Treiber und jeweils einen
Ring-Buffer für RX und TX. Das mache ich auch ohne RTOS immer so.