MiniOS, Beispiel
Beispiel-Task und Hinweise zur Anwendung von MiniOS.
Eine Task-Hauptfunktion als Beispiel:
void Task0(void) // Task0...Task250 max
{
static char TaskVar; // static: Var behält Wert
// bei einem Task-Wechsel
SCHEDULE() // Task-Wechsel: Init Tasks
while (1) // Task-Loop
{
DeineFunktion(); // User-Funktion
while (!INPUT_PIN) // warten auf Hardware-Pin
{
SCHEDULE() // mit Task-Wechsel
if (INPUT_PIN)
break; // bis Pin == 1
}
WeitereFunktion(); // User-Funktion
OS_WaitTimer(400); // Starte Wait-Timer...
SCHEDULE() // ...derweil Taskwechsel
}
}
Bitte beachten:
-
Lokale Task-Variablen, die den Task-Wechsel überdauern sollen, müssen static deklariert sein. Sie bleiben im RAM und behalten ihre Werte.
-
Non-Static-Variablen sind hier erlaubt:
- lokale Variablen in User-/Unterfunktionen der Task.
- lokale Variablen die nur bis zum nächsten Taskwechsel überleben müssen.
-
Jede Task muss mindestens einen sich wiederholenden Task-Wechsel - z.B. SCHEDULE() - enthalten, um die weiteren Tasks nicht zu blockieren.
-
Ein Kontextwechsel wie SCHEDULE(), darf nur in der Task-Hauptfunktion (nicht in einer Task-Unterfunktion) aufgerufen werden.
-
Task-Hauptfunktionen können mittels Mailboxen, shared Memory und Semaphoren miteinander Daten austauschen.
-
Task-Hauptfunktionen können keine Parameter-Werte empfangen oder zurückgeben.
-
Für den Task-Wechsel (Kontext-Switching) benötigt MiniOS die ANSI-C-Bibliothek SETJMP.H (diese ist in einer Standard-C-Umgebung normalerweise vorhanden...).
-
In einer ISR (Interrupt-Subroutine) dürfen nur die dafür bezeichneten API-Funktionen aufgerufen werden, siehe API-Doku.
-
Die Integration von MiniOS in ein Projekt ist simple: OS-Lib-Dateien mittels header.h ins Projekt inkludieren und Projekt neu builden.
-
Compiler-Optimierung ausschalten oder Optimierungsgrade testen...
-
...und/oder globale Variablen die in ISRs verändert werden, volatile deklarieren (z.B. Semaphoren, Mailbox, eigene Globale).