Forum: Mikrocontroller und Digitale Elektronik FreeRTOS 2 Tasks aufm STM32 - Task Handling


von paule (Gast)


Lesenswert?

Hallo,

ich hab auf einem STM32 FreeRtos implementiert.

In einem Receive Task werden die Daten aus einer Queue,die per Interrupt 
befüllt wird,  byteweise an eine Verarbeitungsfunktion weitergegeben und 
dann wieder rausgeschickt über Uart.

Jetzt habe ich noch einen Task erstellt, in dem überprüft wird ob Daten 
am Eingang eines Pins liegen. Jedoch kollidieren die Tasks immer obwohl 
sie unterschiedliche Prioritäten haben.

Ansatz meinerseits war jetzt beiden Tasks dieselbe Priorität zu geben, 
dann werden die Tasks, so wie ich verstanden habe hintereinander 
ausgeführt nach Round Robin.

Wie muss ich meine Tasks einstellen, damit das funktioniert?
Habe ich es richtig verstanden, das in Zeiten wo ein höhrer Task nichts 
zu tun hat, der Task mit der niedrigen Priorität ausgeführt wird und 
danach wieder zurückspringt?

Gruß
paule

von Alex (Gast)


Lesenswert?

Hallo Paule,
wenn ich dich richtig verstehe liegt dein Problem darin, dass zwei 
unterschiedliche Tasks die selbe Ressource nutzen müssen (UART)
Task1 nutzt diesen UART zur Ausgabe
Task2 nutzt diesen UART zur Eingabe
liege ich da richtig?

Wenn dem so ist wären Mutexe die Lösung des Problems
http://www.freertos.org/index.html?http://www.freertos.org/Inter-Task-Communication.html#Mutexes

Grüße
Alex

von paule (Gast)


Lesenswert?

Hallo,

nein nicht direkt, meine UART Empfangsroutine wird ber unterbrochen von 
dem anderen Task, manmchmal eher manchmal manchmal später.

Ich versuchs nochmal kurz näher zu beschreiben:

UART Empfang über Interrupt mit Queue

Task1:
-liest die Queue byteweise aus,  jedesmal nach einem Byte wird die 
auswerteroutine aufgerufen als if ..then if..then und sendet dann direkt 
wieder raus

Task2:
-soll abfragen ob Daten zum senden bereit liegen und in eine Queue 
schreiben, ist eine andere als die oben

Phänomen:
Der Datenverkehr wird unterbrochen. Wenn ich stoppe mit dem debugger, 
dann befinde ich mich im Task 2.

Wie händel ich jetzt Task1 und Task2?

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Evtl. lässt der Task höhrere Priorität dem anderen keine "Luft". 
Getestet was passiert, wenn beide Tasks identische Priorität haben?

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Morgen Paule
Ich versuche es nochmal zu verstehen :-).
Also ich habe eine Skizze erstellt damit man nicht aneinander vorbei 
redet :-). Entspricht die Zeichnung in etwa dem was du machen willst?

Wen dem so ist, welche Queues verwendest du? Die von Freertos oder 
Eigene. Wenn die Queues von Freertos zum Einsatz kommen wartest du 
wahrscheinlich durch ein Abfrage von  -> xQueueReceive auf die 
betreffende Queue ob dort Zeichen vorhanden sind (Task1 vom UART, und 
TASK2 von der Anwendung). Wenn xQueueReceive in beiden fällen verwendet 
wird müsste es problemlos funktionieren, da ein Task nur dann ausgeführt 
wird wenn auch wirklich was in der Queue existiert, im anderen Fall wird 
er geblockt.

Wenn du allerdings ein anderes Queue Konstrukt einsetzst und aktiv 
Wartest (Polling)verwendest kann es durchaus passieren, dass ein Task 
einen blockiert wenn du z.B. Pausen nach der Abfrage vergisst.

Güße
Alex

von paule (Gast)


Lesenswert?

Hallo,

Ja ich benutze die Queues von FreeRTOS.

ja so in etwa ist es. Wenn ich Zeichen aus der Queue nehmen, dann 
benutze ich doch den Command: xQueueReceive( hSerialRx, &cReceivedChar, 
100), wobei dann der 2te Parameter dem empfangenen Zeichen entspricht?

Dadurch wird die Queue doch auch direkt geleert, oder?

von Tueftler (Gast)


Lesenswert?

Ja damit wird das letzte Item der Queue entnommen.

Aus deiner Beschreibung werde ich noch nicht richtig schlau.
Haben die Tasks irgendwas gemeinsam, außer, dass sie beide Queues 
benutzen? Ist es die gleiche queue, kommmen die Daten von der gleichen 
Quelle, werden die Daten auf der Selben Schnittstelle ausgegeben?
Drück dich mal etwas klarer und präziser aus!

von paule (Gast)


Lesenswert?

Hallo,

es ist eine Queue dabei, die von beiden Tasks verwendet wird.

Task1:
-liest die Queue hserialrx byteweise aus,  jedesmal nach einem Byte wird 
die
Auswerteroutine aufgerufen als if ..then if..then und sendet dann direkt
wieder raus, danach wird abgeprüft ob die Queue FillBYte Daten enthält

Task2:
- füllt bytes in die Queue FillByte, woher die Daten kommen ist ja egal, 
nur sie muss eben regelmäßig aufgerufen werden.


Gruß
paule

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.