Forum: Mikrocontroller und Digitale Elektronik Wie mit FreeRtos einen Task mit 2 unterschiedlichen events aufwecken


von Dirk (Gast)


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

von Alram L. (alram)


Lesenswert?

hi,

zwei tasks:
- einer geht für eine bestimmte tickanzahl in delay
http://www.freertos.org/a00127.html

- der andere wartet auf der queue, bis etwas kommt:
http://www.freertos.org/Embedded-RTOS-Queues.html
(solange nur diese beiden task existieren, kann aber nur der 1. task 
etwas in die Q schreiben)

was ist dabei unklar?

vg

von drama (Gast)


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.

von Dirk (Gast)


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?

von Dirk (Gast)


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.

von Eric B. (beric)


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

von Dirk (Gast)


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?

von Eric B. (beric)


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)

von Dirk (Gast)


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

von Steffen R. (steffen_rose)


Lesenswert?

http://www.freertos.org/Pend-on-multiple-rtos-objects.html

Das QueueSet kann Queues und Semaphores enthalten.

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.