@FreeRTOS und Co. zu aufwendig?
Ich verwende sehr gern das Minimalmultitasking UEXC von Richard Man.
Mittlerweile habe ich es auf weitere µC portiert. Das ist genau das was
ich brauche. Nur leider ist die Portierung auf den ARM nicht (?)
möglich/zu aufwendig.
In praktisch allen meinen Embedded Applikationen kann die zu lösende
Aufgabe in zwei Komponenten zerlegt werden; schnelle Funktionen mit
harten Echtzeitanforderungen und Funktionalitäten mit hohem
Rechenaufwand, meist in der Ausführungszeit deutlich unkritischer.
Der erste Part landet entweder direkt in der ISR oder wird in
kooperativ arbeitende zyklisch laufende Schnippselchen zerlegt, z.B.
Aufruf in einem Raster von ca. 25 ms.
Komplexe Algorithmen in kurze Sequenzen zu zerlegen ist in der Regel
aufwendig; hier ist es schön, gelingt es die Arbeit in eine "endless
loop" zu verpacken.
Ist eine Kommunikation zwischen Funktionen nötig, werden die
Schnittstellen entsprechend definiert, die Vorzüge von verfügbaren
Semaphoren oder Message-Queues greifen nur bedingt.
Nicht zu letzt ist die Sicherheit und Testbarkeit ein wichtiges
Kriterium. Je nach Anforderung der Applikation muß ich bei Verwendung
zusätzlicher Komponenten diese auch zusätzlich testen. Mit anderen
Worten ich steige dann ziemlich tief in ein mir fremdes Programm ein.
@Register fummeln
Die Grundfunktionen eines Multitasking-Systems beinhalten das Starten
eines neuen Tasks bzw. den Context-Switch zwischen zwei aktiven Tasks.
Im Regelfall erfolgt dies in einer ISR. Zum Start eines neuen Tasks muß
diesem im Minimum ein eigener Stackbereich zugewiesen werden. Oft
"bastelt" man deshalb einen Interrupt-Return Stack, verläßt dann mit
reti die ISR und der neue Task holt sich seine Werte vom Stack.
Beim ARM geht dies nicht ganz so einfach. Ein reti gibt es dort nicht.
Ich muß also den SP und das LR definiert setzen und dann das
Prozessor-Mode-Register (CPSR) einstellen. Und genau da liegt der Hase
im Pfeffer. Wenn ich das so mache wie ich der Meinung bin, es tun zu
sollen, funktioniert es nur solange ich über JTAG debugge.
Ohne Debugger gehts halt nicht.
Im Context-Switch muß ich mich wieder an den Registern vergreifen.
Zuerst werden die "alten" Register auf dem "alten" Stack gesichert,
dann der neue Kram vom neuen Stack geholt - ISR verlassen und wie von
Zauberhand ist der neue Task aktiv. So die Theorie. Gehen tuts halt nur
mit Debugger...
Bleibt die Frage zu klären warum ich mir dies antue? Ein fertiges RTOS
und los gehts, oder nicht?
Nun, um es ganz klar zu stellen, ich bin nicht gegen fertige Lösungen,
aber lieber teste und suche ich die Fehler jetzt, als später mit
Schweißperlen auf der Stirn ein riesen System umzugraben, weil es
manchmal/immer/selten abschmiert ohne mir zu sagen warum.
MfG
Jens