Wie mit FreeRtos einen Task mit 2 unterschiedlichen events aufwecken

Gast #4058463
Lesenswert?
• ▲
▼
Hallo.

Ich muss was mit FreeRtos bauen und bin darin noch nicht so ganz fit.

Ich muss einen Task periodisch alle 100ms laufen lassen um 
Statusinformationen einzulesen (externer Sensor). Asynchron dazu muss 
ich aber auch auf eine MSG einer Queue loslegen und diese verarbeiten.

Wie macht man so etwas mit FreeRtos?

Dirk
Gast #4058508
Lesenswert?
• ▲
▼
Dirk schrieb:
> Ich muss einen Task periodisch alle 100ms laufen lassen um
> Statusinformationen einzulesen (externer Sensor). Asynchron dazu muss
> ich aber auch auf eine MSG einer Queue loslegen und diese verarbeiten.
>

Wenn's geht einfach in zwei Tasks aufteilen, das wäre ggf. die sauberste 
Lösung.

Andere Ideen:

- Sensor auslesen mittels Software-Timer-Callback
- Mit Timeouts auf eine Nachricht an der Queue warten. Kann aber etwas 
fummelig werden.
Gast #4058516
Lesenswert?
• ▲
▼
Es handelt sich um einen Task der auf die 2 Events (Zeit oder MSG) 
aufwachen muss.

Das gesamt System hat logischerweise mehr als einen Task. Darunter ist 
auch der MSG Sender.

Mit vTaskDelay habe ich im ersten Schritt mal meine Zeit Geschichten 
gemacht, aber da die Verarbeitungszeit bei mir zwischen 0,01ms und 15ms 
liegt ist das auch nicht gerade ein sauberes Zeitsystem.

vTaskDelayUntil ist da schon etwas besser, aber wie kann man nun den 
Task aufwachen lassen bei einer MSG?
Gast #4058645
Lesenswert?
• ▲
▼
Könnte man das mit xTaskNotifyWait und xTaskNotify sowie mit einem Timer 
machen?

Das einzige was mich da stört ist das ich dann nach den setzen der Queue 
ein xTaskNotify machen müsste und im Timercallback das selbe.
#4058652
Lesenswert?
• ▲
▼
Dirk schrieb:
> aber wie kann man nun den Task aufwachen lassen bei einer MSG?

Indem man den Task zum schlafen legt mit xQueueReceive.

Die Lösung mit 2 Tasks ist aber sauberer!
Gegebenenfalls die beide über ein Mutex synchronisieren.
1
taskA:
2
  loop
3
    wait X ms
4
    doSomething
5
  end loop
6

7
taskB:
8
  loop
9
    wait for msg from queue
10
    doSomething
11
  end loop
12

13
function doSomething:
14
  take mutex
15
  if success
16
    do the do 
17
    give mutex
18
  end if
Gast #4058769
Lesenswert?
• ▲
▼
Wie schon gesagt ist das mit 2 Tasks nicht so das Wahre. Alleine schon 
deswegen weil ich dann alles Global anlegen kann und nicht mehr sauber 
in einem Task gekapselt bin.

Ja klar geht das, aber unter einer saubere Sache, stelle ich mit halt 
was anderes vor.

Wenn ich das richtig gesehen haben müsste das auch mit einer Eventgruppe 
gehen. Aber da ist es wieder das selbe System mit dem Auslösen von einem 
Event.

Irgendwie scheint es aber nicht anders sauber zu gehen als mit 
xTaskNotify oder?
#4058782
Lesenswert?
• ▲
▼
Dirk schrieb:
> Wie schon gesagt ist das mit 2 Tasks nicht so das Wahre. Alleine schon
> deswegen weil ich dann alles Global anlegen kann und nicht mehr sauber
> in einem Task gekapselt bin.

Hmja, daran hatte ich nicht gedacht.

Alternativ könntest du im Timer- und Message Event nur ein Semaphore 
oder Mutex freigeben, auf den du im Task wartest. Der Task muss dann 
aber irgendwie noch rausfinden ob er vom Timer oder vom Message 
aufgewacht wurde.
1
task:
2
  loop
3
    wait(sem)
4
    do the do
5
  end loop
6

7
timer_event:
8
  give(sem)
9

10
message_event:
11
  give(sem)
Gast #4058814
Lesenswert?
• ▲
▼
Wobei das was Du jetzt vorschlägst ist im Grunde das selbe wie das 
xTaskNotify oder die Eventgruppe.

Einer wartet und 2 andere geben ein Startkommando.

Gut dann wird es wohl auf xTaskNotify  hinauslaufen.

Danke, Dirk

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.