Opened 11 years ago

Closed 11 years ago

#85 closed Aufgabe (fixed)

Verpasste Telegramme

Reported by: Melanie Hermann Owned by: Melanie Hermann
Priority: kurzfristig Milestone:
Component: Gesamtsystem Version:
Severity: Aufgabe Keywords:
Cc:

Description

Ab und zu kommt die Warnung "GCProt Telegramm verpasst".
Prüfen welche Telegramme verpasst werden, warum und was dagegen unternommen werden kann.

Change History (2)

comment:1 by Melanie Hermann, 11 years ago

Lösung:
Die Telegramme wurden nicht, wie angenommen, verpasst. Die GCProt-Queue war nicht threadsicher programmiert. Da die Funktion zum Befüllen der Queue aus verschiedenen Threads aufgerufen wird konnte es vorkommen, dass sich diese Threads in die Quere gekommen sind und die Telegramme somit fehlerhaft oder in der falschen Reihenfolge in der Queue gelandet sind.

Änderungen:

  • GcProt.h: Deklaration der neuen Membervariable m_queuelock.
  • GcProt.cpp:
    • FillRxMessageQueue(): Funktion durch CriticalSection gesichert.
    • SendDataToGateway(): Funktion durch CriticalSection gesichert.
    • ProcessReceivedData(): Aufruf der Funktion RemoveRxItemFromHead() durch CriticalSection gesichert.
    • DoGCProt_Controller(): Aufruf der Funktion RemoveTxItemFromHead() durch CriticalSection gesichert.

Kommentar:
Eine CriticalSection verhindert, dass ein anderer Thread den aktuellen Thread unterbricht und zur gleichen Zeit auf die Daten zugreift, die gelockt sind. Andere Threads, die nichts mit diesen Daten zu tun haben können jedoch sehr wohl den aktuellen Thread unterbrechen und mit anderen Daten arbeiten.
Ein Mutex hingegen verhindert jegliche Unterbrechung durch andere Threads. Dabei spielt es keine Rolle ob diese Threads auf die gleichen Daten zugreifen möchten oder nicht.

comment:2 by Melanie Hermann, 11 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.