Forum: Mikrocontroller und Digitale Elektronik IPC mit FreeRTOS - "Remotefunktion"


von Basti (Gast)


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

von 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?

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.