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
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
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.
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?
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.
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 |
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?
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) |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.