Hallo, ich habe eine Frage zur IPC mit FreeRTOS oder auch allgemein zur IPC. Ich habe zwei Tasks: - Netzwerktask -> kann einige hundert ms verzögert werden - Arbeitstask -> kann nur einige ms verzögert werden, hat jedoch einen "Ruhemodus" Nun möchte ich dem Arbeitstask eine Aufgabe aus dem Netzwerktask zuweisen. Ich habe zwei Queues mit jeweils nur einem Speicherplatz angelegt. Eine ist für die Aufgabenzuweisung und eine für die Rückmeldung ob die Aufgabe auch entgegengenommen wurde. Nun mache ich im Netzwerktask folgendes (exemplarisch): if(!QueueSend(send_handle, daten, 100ms)) -> Aufgabenzuweisung fehlgeschlagen if(!QueueRecv(recv_handle, daten, 100ms)) -> Aufgabenzuweisung fehlgeschlagen if(!daten.ACK) -> Aufgabenzuweisung fehlgeschlagen Im Arbeitstask kontrolliere ich bloß die fifo send_handle ohne zu blockieren: if(QueueRecv(send_handle, daten, 0ms)) -> prüfe Daten und sende ACK oder NAK Das funktioniert so lange "gut" bis der Arbeitstask mal über 100 ms blockiert, also in dem besprochenen Ruhemodus ist. Dann bekommt der Netzwerktask ein NAK und der Arbeitstask empfängt send_handle nach seinem Ruhemodus und ACK es. Die Folge: beide Task asynchrone. Einfach send_handle wieder aus dem Netzwerktask löschen würde zu race conditions führen. Ich denke die Aufgabenstellung sollte in einem RTOS recht häufig vorkommen und ich stehe auf dem Schlauch. Kann mich mal bitte jemand vom Schlauch schupsen? Danke Basti
Weiß keiner weiter? Ich hätte noch ein Idee... kA, ob die gut ist... Wenn man es mal auf real life runter bricht: Ich (Netzwerktask) schicke einen Boten zur Bushaltestelle, der 30 Minuten auf einen Bus warten soll, um dem Busfahrer einen neue Aufgabe zu geben, der normalerweise aller 10 Minuten vorbei kommt. Der Bote kommt also 30 Minuten später zurück und hat entweder: den Bus nicht angetroffen, der Busfahrer führt den Job aus, der Busfahrer führt den Job nicht aus. Mit der Implementierung von oben stellt mein Bote ein Schild auf mit dem Job der ausgeführt werden soll und geht nach 30 Minuten wieder... das ist nicht das, was ich will. Mir fällt jetzt nur was mit einem Mutex ein, der einen gemeinsamen Speicherbereich schützt ein. Eine weitere Semaphore signalisiert das der Bus eingetroffen ist und der Bote nicht voll 30 Minuten stehen muss... Geht das nicht schöner?
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.