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
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
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?
Evtl. lässt der Task höhrere Priorität dem anderen keine "Luft". Getestet was passiert, wenn beide Tasks identische Priorität haben?
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
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?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
