Forum: Mikrocontroller und Digitale Elektronik FreeRTOS Task Scheduling


von Bj (Gast)


Lesenswert?

Hallo Forum,

für mein nächstes Projekt denke ich darüber nach, FreeRTOS einzusetzen.
Nun habe ich noch ein paar Fragen zum Task Scheduling.

1. Ich möchte z.B. alle Sekunde verschiedene Temperaturen einlesen.
Wie kann ich dem Scheduler mitteilen dass meine Mess-Task im 
Sekunden-Takt gestartet werden soll. In der Task-Schleife ein 
_delay_ms(1000) wird wohl nur eine sub-optimale Lösung sein.

2. Abhängig von verschiedenen Bedingungen soll ein Alarm via Handy 
verschickt werden. In der Transmission-Task also anschalten des Handy, 
bei Netzverbindung absetzen der Alarm-Meldung und danach wieder 
abschalten.
Wie entferne ich diese Task dann wieder aus dem Scheduler ? Kann sich 
eine Task selbst terminieren oder muss sie "von aussen" gelöscht werden 
?

3. Zur Visualisierung von Messwerten muss ein Display-Cache alle 15ms 
ausgegeben werden ? Ähnlich wie Frage 1: wie teile ich dem Scheduler mit 
dass die Visualisierungstask alle 15ms mit höchster Priorität Daten 
transferiert und sonst niederprior wartet, ggf. gar nicht bedient wird.

4. Gibt es Pre- oder Post-Task Hooks zum aktivieren/deaktivieren der HW 
oder muss dass in der Task gelöst werden.

5. Wie kann ich mein System geschickt in den Sleep-Mode fahren ?
(also Wake-Up Button konfigurieren, dann Clock-Stop bis zur nächsten 
Flanke und anschliessend Scheduling fortführen - kein Neustart)

Wäre nett wenn mir ein FreeRTOS Profi einige Hinweise geben könnte.

Danke und frohes Fest schon mal - Bj.

von (prx) A. K. (prx)


Lesenswert?

Bj schrieb:

> für mein nächstes Projekt denke ich darüber nach, FreeRTOS einzusetzen.
> Nun habe ich noch ein paar Fragen zum Task Scheduling.

Allgemein, ohne jetzt direkt auf Bezeichnungen und Eigenschaften von 
FreeRTOS einzugehen:

> 1. Ich möchte z.B. alle Sekunde verschiedene Temperaturen einlesen.
> Wie kann ich dem Scheduler mitteilen dass meine Mess-Task im
> Sekunden-Takt gestartet werden soll. In der Task-Schleife ein
> _delay_ms(1000) wird wohl nur eine sub-optimale Lösung sein.

In jedem RTOS existieren APIs / Timer, die eine bestimmte Zeit / 
Mindestzeit warten, ohne dabei Rechenzeit zu verbraten. GGf. auch Timer, 
die zyklisch was auslösen. => Doku.

> Wie entferne ich diese Task dann wieder aus dem Scheduler ? Kann sich
> eine Task selbst terminieren oder muss sie "von aussen" gelöscht werden

Das dürfte zwar in der Doku stehen, aber die Nummer läuft anders. Lass 
die Task am Leben, aber schlafend.

Sinngemäss:
  while (1) {
    waitfor_event(alarm_event);
    poweron_hardware;
    send_alarm;
    poweroff_hardware;
  }
Und anderso wird das ausgelöst mit
  trigger_event(alarm_event);

> 3. Zur Visualisierung von Messwerten muss ein Display-Cache alle 15ms
> ausgegeben werden ? Ähnlich wie Frage 1: wie teile ich dem Scheduler mit
> dass die Visualisierungstask alle 15ms mit höchster Priorität Daten
> transferiert und sonst niederprior wartet, ggf. gar nicht bedient wird.

Task mit hoher Priorität, sonst siehe 1.

> 4. Gibt es Pre- oder Post-Task Hooks zum aktivieren/deaktivieren der HW
> oder muss dass in der Task gelöst werden.

???

> 5. Wie kann ich mein System geschickt in den Sleep-Mode fahren ?
> (also Wake-Up Button konfigurieren, dann Clock-Stop bis zur nächsten
> Flanke und anschliessend Scheduling fortführen - kein Neustart)

Es gibt meistens eine Idle-Task, die genau dann läuft wenn sonst nichts 
los ist. Entweder krallt man sich diese direkt selbst und baut dort den 
Stromsparmodus ein, oder es gibt dort drin einen Hook dafür.

von Eddy C. (chrisi)


Lesenswert?

Bj schrieb:
> Hallo Forum,
Hi

> 1. Ich möchte z.B. alle Sekunde verschiedene Temperaturen einlesen.
> Wie kann ich dem Scheduler mitteilen dass meine Mess-Task im
> Sekunden-Takt gestartet werden soll. In der Task-Schleife ein
> _delay_ms(1000) wird wohl nur eine sub-optimale Lösung sein.
Im Prinzip geht das genau so, nur verwendet man die entsprechende 
RTOS-Funktion vTaskDelay, mit der der Task für die Zeitspanne Schlafen 
gelegt wird.

> 2. Abhängig von verschiedenen Bedingungen soll ein Alarm via Handy
> verschickt werden. In der Transmission-Task also anschalten des Handy,
> bei Netzverbindung absetzen der Alarm-Meldung und danach wieder
> abschalten.
> Wie entferne ich diese Task dann wieder aus dem Scheduler ? Kann sich
> eine Task selbst terminieren oder muss sie "von aussen" gelöscht werden
> ?
Task löschen ginge, ist aber nicht im Sinne des Erfinders. Schließlich 
muß irgendwo auch die Bedingung geprüft werden, da scheint also noch 
irgendwo z.B. zyklisch eine Prüfung statt zu finden.
Falls Bedingung erfüllt kannst Du entweder (blockierend) in diesem Task 
die Daten versenden, oder Du schickst per Queue oder Semaphore ein 
Signal an einen schlafenden Task, der damit geweckt wird.

> 3. Zur Visualisierung von Messwerten muss ein Display-Cache alle 15ms
> ausgegeben werden ? Ähnlich wie Frage 1: wie teile ich dem Scheduler mit
> dass die Visualisierungstask alle 15ms mit höchster Priorität Daten
> transferiert und sonst niederprior wartet, ggf. gar nicht bedient wird.
Wieder ein Delay.

> 4. Gibt es Pre- oder Post-Task Hooks zum aktivieren/deaktivieren der HW
> oder muss dass in der Task gelöst werden.
Nein. Da müßtest Du selber ran. Aber mir scheint, das wird nicht 
notwendig sein.

> 5. Wie kann ich mein System geschickt in den Sleep-Mode fahren ?
> (also Wake-Up Button konfigurieren, dann Clock-Stop bis zur nächsten
> Flanke und anschliessend Scheduling fortführen - kein Neustart)
Das wirst Du um FreeRTOS herum programmieren müssen, also Scheduler 
anhalten und nur noch die genannten Teile so konfigurieren, dass das 
System wieder hochkommt. Möglicherweise ist es sogar einfacher und 
deterministischer, komplett auf FreeRTOS zu verzichten.

> Danke und frohes Fest schon mal - Bj.
Danke - gleichfalls.

von Manuel S. (thymythos) Benutzerseite


Lesenswert?

Eddy Current schrieb:
> Bj schrieb:
>> Hallo Forum,
> Hi
>
>> 1. Ich möchte z.B. alle Sekunde verschiedene Temperaturen einlesen.
>> Wie kann ich dem Scheduler mitteilen dass meine Mess-Task im
>> Sekunden-Takt gestartet werden soll. In der Task-Schleife ein
>> _delay_ms(1000) wird wohl nur eine sub-optimale Lösung sein.
> Im Prinzip geht das genau so, nur verwendet man die entsprechende
> RTOS-Funktion vTaskDelay, mit der der Task für die Zeitspanne Schlafen
> gelegt wird.

Wenns periodisch sein soll willst du eigentlich vTaskDelayUntil 
verwenden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.