IPC mit FreeRTOS - "Remotefunktion"

Gast #5179164
Lesenswert?
• ▲
▼
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
Gast
Lesenswert?
• ▲
▼
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.